Home > front end >  Perl Apache script runs from browser-perfroms as expected closes a running perl instance but when tr
Perl Apache script runs from browser-perfroms as expected closes a running perl instance but when tr

Time:10-19

I have a server running Perl and an Apache web server.

I wrote a script which closes running instances of perl.exe and then launches them again, with some system() commands.

When I try and run it from a browser it works as expected, closes all running perl.exe, but then it doesn't restart them with my system("start my_script.pl").

This is my script running from the browser.

#!/Perl/bin/perl

use lib "/Perl/ta/mods" ;

# http://my_domain.com/cgi-bin/myscript.pl?

use CGI::Carp qw(fatalsToBrowser);
use IPC::System::Simple qw(system capture);
use Win32::Process::List;

my $script_to_end = "start \path_to_script\myscript.pl" ;

system($script_to_end);

print "done" ;

exit;

This launching myscript.pl which does the following:

#!/Perl/bin/perl
use strict;
use warnings;
use lib "/Perl/ta/mods" ;
use Win32::Process::List;

my $script = 'io.socket' ;
my @port = (4005,5004) ;


my $scriptpath_4005 = "Perl C:\\path_to_script\\$script.pl $port[0]";
my $scriptpath_5004 = "Perl C:\\path_to_script\\$script.pl $port[1]";

our $nmealogger = "C:\\nmealogger\\nmealogger.exe";
system('TASKKILL /F /IM nmealogger* /T 2>nul');

print "current running perl instance: $$\n" ;

my $P = Win32::Process::List->new();  #constructor
my %list = $P->GetProcesses();        #returns the hashes with PID and process name
foreach my $key ( keys %list ) {
    unless ($list{$key} eq 'perl.exe') { next ; }
    # $active_perl_pid{$key} = 1 ;
    print sprintf("0s has PID s", $list{$key}, $key) . "\n\n";
    if ($$ == $key)
    {
        print "current running perl instance: $key\n";
        next;
    } else {
        print "kill: $key\n";
        system("TASKKILL /F /PID $key");
        # system('TASKKILL /F /IM powershell* /T 2>nul');
        }
}
system "start $nmealogger" ;
system "start $scriptpath_4005";
system "start $scriptpath_5004";


use common_cms;

exit;

This works fine if I run it from the machine, kills all perl.exe and re-launches perl.exe, but running from the browser it only kills them but never re-launches them.

I thought it could be to do with the httpd.conf settings but I'm not sure.

Any help would be greatly appreciated.

Thanks

CodePudding user response:

Update: I couldn't get around this issue so took a different approach.

Ended up changing the script running from the browser to write a log file on the server and created a scheduled task that runs every minute to check if that file exists, which then kicks of my script on the server.

Quite a long way around but hey it works.

Thanks for the suggestions, much appreciated.

CodePudding user response:

"start" runs the script in a new command window, correct? Presumably Apache is a service, please see related https://stackoverflow.com/a/36843039/2812012.

  • Related