我有一個運行 Perl 的服務器和一個 Apache Web 服務器。
我撰寫了一個腳本,它關閉正在運行的 perl.exe 實體,然后使用一些 system() 命令再次啟動它們。
當我嘗試從瀏覽器運行它時,它按預期作業,關閉所有正在運行的 perl.exe,但隨后它不會用我的系統重新啟動它們(“啟動 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("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;
如果我從機器上運行它,這作業正常,殺死所有 perl.exe 并重新啟動 perl.exe,但從瀏覽器運行它只會殺死它們但不會重新啟動它們。
我認為這可能與 httpd.conf 設定有關,但我不確定。
任何幫助將不勝感激。
謝謝
uj5u.com熱心網友回復:
更新:我無法解決這個問題,所以采取了不同的方法。
最終更改從瀏覽器運行的腳本以在服務器上寫入日志檔案并創建一個計劃任務,該任務每分鐘運行一次以檢查該檔案是否存在,然后在服務器上啟動我的腳本。
很長的路要走,但嘿它有效。
感謝您的建議,非常感謝。
uj5u.com熱心網友回復:
“開始”在新的命令視窗中運行腳本,對嗎?想必Apache是??一個服務,相關請看https://stackoverflow.com/a/36843039/2812012。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/324607.html
