我有一个运行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。