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 脚本的脚本返回格式错误的标头

使用Perl解析JSON

在哪里放置 bash 完成脚本

Apache 未在包含的 perl 脚本中执行“do”包含函数

从另一个环境调用 Perl 在后台

Python 中 Perl 的 (<>) 等价物是啥?文件输入没有按预期工作