Perl Apache脚本从浏览器运行-按预期执行关闭正在运行的Perl实例,但当试图启动一个新的Perl实例时,它什么



我有一个运行Perl的服务器和一个Apache web服务器。

我写了一个脚本,关闭正在运行的perl.exe实例,然后再启动它们,使用一些system()命令。

当我尝试从浏览器中运行它时,它按预期工作,关闭所有正在运行的perl.exe,但随后它不会在我的系统中重新启动它们("start my_script.pl")。

这是我在浏览器中运行的脚本。

#!/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_scriptmyscript.pl" ;
system($script_to_end);
print "done" ;
exit;

启动myscript.pl,执行以下操作:

#!/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("%30s has PID %15s", $list{$key}, $key) . "nn";
if ($$ == $key)
{
print "current running perl instance: $keyn";
next;
} else {
print "kill: $keyn";
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;

如果我从机器上运行它,杀死所有的perl.exe并重新启动perl.exe,但从浏览器运行它只杀死它们,但从不重新启动它们。

我认为这可能与httpd.conf设置有关,但我不确定。

任何帮助都将是非常感激的。

感谢

更新:我无法绕过这个问题,所以采取了不同的方法。

最终改变了从浏览器运行的脚本,在服务器上写一个日志文件,并创建了一个计划任务,每分钟运行一次,检查该文件是否存在,然后在服务器上踢我的脚本。

很长一段路,但它是有效的。

谢谢你的建议,非常感谢。

start"在新的命令窗口中运行脚本,正确吗?假设Apache是一个服务,请参阅相关的https://stackoverflow.com/a/36843039/2812012。

相关内容

  • 没有找到相关文章

最新更新