2014-05-18 92 views
0

更新:編輯以使問題更容易理解。在Perl中運行後臺進程

我正在創建一個腳本,它會自動分析HTTP上載文件,並將上傳文件的信息(如名稱,上載時間)存儲到另一個數據文件中。這些信息可以在mod_security日誌文件中找到。 mod_security有一個規則,我們可以將上傳的文件重定向到Perl腳本。在我的情況下,Perl腳本是upload.pl。在這個Perl腳本中,我將使用ClamAV防病毒掃描上傳的文件。但mod_sec只會記錄上傳的文件信息,如名稱,Perl腳本upload.pl執行後的上傳時間。但是我正在用execute.pl中的sleep(10)從upload.pl啓動另一個perl腳本execute.pl。目的是execute.pl只有在upload.pl完成後才能啓動它的功能。我需要執行execute.pl作爲後臺進程,並且upload.pl應該完成而不會等待execute.pl的輸出。

但我的問題是,我已經使execute.pl在後臺運行,HTTP上傳等待execute.pl的完成,即使我已經使進程在後臺執行。我需要upload.pl才能完成,而不必等待execute.pl的輸出。該腳本在控制檯中運行良好。例如,我從控制檯執行perl upload.pl,完全執行upload.pl而不等待execute.pl的輸出。但是當我通過apache嘗試相同的時候,這意味着當我上傳示例文件時,upload.pl和execute.pl都會上傳完成。由於execute.pl已經作爲後臺進程從upload.pl中調用,所以上傳過程應該完成而不需要等待execute.pl的輸出。

我已經試過的方法至今都

system("cmd &") 

my $pid = fork(); 
if (defined($pid) && $pid==0) { 
    # background process 
    my $exit_code = system($command); 
    exit $exit_code >> 8; 
} 

my $pid = fork(); 
if (defined($pid) && $pid==0) { 
    exec($command); 
} 
+0

你問題很難理解!你告訴我們某個文件的名字,但是再也不會引用它,並且你指的是「第一個文件」和「第二個文件」,但從不說哪個是哪個文件。您引用了一個「執行某些事情」的腳本,並告訴我們您將獲得「控制檯訪問」權限,但不是您想要的,也不是您需要「記錄器記錄日誌」的原因。 –

+0

@mark我做了更改 – Nijin

+0

不知道你在問什麼。你說你的問題是你讓一些進程等待你的兩個腳本完成執行。如果這確實是你的問題,那麼它的答案似乎是「然後拿出你要做的代碼!」但我懷疑這根本不是你的問題。 – ikegami

回答

0

問題的另一種方式:
如何啓動一個Perl守護程序進程用perl我們bscript?

答:
關鍵是要關閉後臺作業的數據流,因爲它們共享:

Webscript:

#!/usr/bin/perl 

#print html header 
print <<HTML; 
Content-Type: text/html 

<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html><head><title>Webscript</title> 
<meta http-equiv="refresh" content="2; url=http://<your host>/webscript.pl" /> 
</head><body><pre> 
HTML 

#get the ps headers 
print `ps -ef | grep STIME | grep -v grep`; 

#get the running backgroundjobs 
print `ps -ef | grep background.pl | grep -v grep`; 

#find any running process... 
$output = `cat /tmp/background.txt`; 

#start the background job if there is no output yet 
`<path of the background job>/background.pl &` unless $output; 

#print the output file 
print "\n\n---\n\n$output</pre></body></html>"; 

後臺作業:

#!/usr/bin/perl 

#close the shared streams! 
close STDIN; 
close STDOUT; 
close STDERR; 

#do something usefull! 
for ($i = 0; $i < 20; $i++) { 
    open FILE, '>>/tmp/background.txt'; 
    printf FILE "Still running! (%2d seconds)\n", $i; 
    close FILE; 

    #getting tired of all the hard work... 
    sleep 1; 
} 

#done 
open FILE, '>>/tmp/background.txt'; 
printf FILE "Done! (%2d seconds)\n", $i; 
close FILE; 
+0

對不起,這對我無效 – Nijin

+0

完全改變了解決方案,這次測試。請讓我知道這對你有沒有用。 – Guido