2015-05-05 58 views
0

我有一個腳本必須啓動2個獨立進程,並等到其中一個完成後再繼續。Perl系統(),exec()和與LSF的交互

到目前爲止,我已經通過創建一個具有if fork pid == 0, exec, else wait的進程來運行它。另一個是使用system和命令行創建的。

現在我準備推出這個腳本,在Platform Load Sharing Facility(LSF)上運行這樣的工作對進程的400次迭代,但是我關心穩定性。我知道這些進程可能會崩潰。在這種情況下,我需要一種方法來知道進程崩潰的時間,並且終止它的對進程和主腳本。

本來我寫了一個3分鐘看守期的看門狗,如果3分鐘不活動通過,它會殺死進程。然而,這引起了很多誤報,因爲當LSF暫停兩個過程中的一個時,監督人員將它們視爲不活動。

在LSF中,當我發佈作業時,我可以選擇殺死它們。但是,當我殺了一份工作時,我究竟殺了什麼?終結會殺死Perl腳本創建的兩個進程嗎?或讓他們像殭屍一樣運行?

要重申,

  • 會殺死對LSF隊列中的作業也會殺死每一個作業已創建的過程?

  • 什麼是最好(最安全?)的方式來從Perl腳本生成兩個獨立的進程,並等待其中一個退出之前繼續?

  • 如何編寫一個能夠區分進程崩潰的進程和由LSF管理員暫停的進程的看門狗?

+0

LSF如何掛起/恢復?我認爲它是通過'SIGSTOP'和'SIGCONT'? 「 – Sobrique

+0

」默認的操作是將以下信號發送到作業: SIGTSTP用於並行或交互式作業。SIGTSTP被主進程捕獲並傳遞到在其他主機上運行的所有從進程 SIGSTOP用於順序作業SIGSTOP不能被用戶程序捕獲,SIGSTOP信號可以通過lsf.conf中的LSB_SIGSTOP參數進行配置。「 從LSF的「作業控制」。我想知道在這種情況下,「奴隸進程」的含義是否指原始作業生成的進程 –

回答

2

監視器是應該創建子進程的監視器。 (它也可以啓動「主要腳本」。)wait會告訴你他們何時崩潰。

my %children; 

my $pid1 = fork(); 
if (!defined($pid1)) { ... } 
if ($pid1) { ... } 
++$children{$pid1}; 

my $pid2 = fork(); 
if (!defined($pid2)) { ... } 
if ($pid2) { ... } 
++$children{$pid2}; 

while (keys(%children)) { 
    my $pid = wait(); 
    next if !$children{$pid}; # !!! 

    delete($children{$pid}); 

    if ($? & 0x7F) { ... } # Killed from signal 
    if ($? >> 8) { ... }  # Returned an error 
} 
+0

因此,您的想法是重構腳本?這樣你就有了一個調用主腳本的腳本,並且還創建了兩個子進程,它使用等待來捕獲返回值並查看它是否出錯或被信號殺死了? –

+0

是。主腳本可以繼承管道給孩子。 – ikegami

+0

另外,你可能不知道'setsid(2)'(可用作'POSIX :: setsid()')。創建可以發送信號的進程組。 – ikegami