Perl Apache 脚本按预期从 browser-perfroms 运行关闭正在运行的 perl 实例,但是当尝试启动新的 perl 实例时它啥也不做
Posted
技术标签:
【中文标题】Perl Apache 脚本按预期从 browser-perfroms 运行关闭正在运行的 perl 实例,但是当尝试启动新的 perl 实例时它啥也不做【英文标题】:Perl Apache script runs from browser-perfroms as expected closes a running perl instance but when trying to launch a new perl instance it does nothingPerl Apache 脚本按预期从 browser-perfroms 运行关闭正在运行的 perl 实例,但是当尝试启动新的 perl 实例时它什么也不做 【发布时间】:2021-12-05 10:05:40 【问题描述】:我有一个运行 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_script\myscript.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) . "\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;
如果我从机器上运行它,它会正常工作,杀死所有 perl.exe 并重新启动 perl.exe,但从浏览器运行它只会杀死它们,但不会重新启动它们。
我认为这可能与 httpd.conf 设置有关,但我不确定。
任何帮助将不胜感激。
谢谢
【问题讨论】:
尝试简化第一个脚本。与其调用myscript.pl
循环并终止任务,不如尝试从 CMD 提示符中终止单个任务,然后尝试通过调用例如从 CGI 脚本启动该任务。 system "start $scriptpath_xyz"
。这只是为了创建一个简化调试的最小示例,请参阅minimal reproducible example 了解更多信息
【参考方案1】:
更新:我无法解决这个问题,所以采取了不同的方法。
最终更改了从浏览器运行的脚本以在服务器上写入日志文件,并创建了一个计划任务,该任务每分钟运行一次以检查该文件是否存在,然后在服务器上启动我的脚本。
很长的路要走,但它确实有效。
感谢您的建议,非常感谢。
【讨论】:
【参考方案2】:"start" 在新的命令窗口中运行脚本,对吗?想必Apache是个服务,请看相关https://***.com/a/36843039/2812012。
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于Perl Apache 脚本按预期从 browser-perfroms 运行关闭正在运行的 perl 实例,但是当尝试启动新的 perl 实例时它啥也不做的主要内容,如果未能解决你的问题,请参考以下文章
Apache 从 Perl CGI 脚本的脚本返回格式错误的标头