2010-07-15 113 views
2

我有一個非常簡單的Perl腳本中被殺,在一個函數執行以下操作:Perl腳本是睡眠()

if (legato_is_up()) { 
     write_log("INFO:  Legato is up and running. Continue the installation."); 
     $wait_minutes = $WAITPERIOD + 1; 
     $legato_up = 1; 
    } 
    else { 
     my $towait = $WAITPERIOD - $wait_minutes; 
     write_log("INFO:  Legato is not up yet. Waiting for another $towait minutes..."); 
     sleep 30; 
     $wait_minutes = $wait_minutes + 0.5; 
    } 

出於某種原因,有時(像1/3運行)的腳本獲取殺害。我不知道誰對殺人負責,我只知道它發生在「睡眠」呼叫期間。

任何人都可以在這裏給我一個提示嗎?腳本被殺後,它的工作沒有完成,這是一個大問題。

謝謝。

+0

是從控制檯執行還是從apache內執行?如果它來自apache,請查看超時選項...也可能在函數的某處出現錯誤,因爲您沒有看到其他代碼,我們無法真正瞭解它們。如果是從瀏覽器調用,並且您正在使用apache或類似的,您可以檢查error_log並查看它是否包含任何可能對您有幫助的東西... – Prix 2010-07-15 19:56:56

+0

它正在從控制檯執行。該腳本是安裝包裝的一部分,用於安裝簡單的軟件。腳本最後運行,目的是驗證軟件是否啓動(這是legato_is_up()所做的)。 操作系統是Red Hat AS3,標準配置。 – Alex 2010-07-15 20:01:53

+0

你有沒有機會在Dreamhost上運行它?他們傾向於殺死持續的進程。 – Schwern 2010-07-15 20:35:37

回答

1

不知道你的系統上還在運行着什麼,這是任何人的猜測。你可以添加一個信號處理程序,但所有它會告訴你是哪些信號是(何時),但不是誰送的:

foreach my $signal (qw(INT PIPE HUP)) 
{ 
    my $old_handler = $SIG{$signal}; 
    $SIG{$signal} = sub { 
     print time, ": ", $signal, " received!\n"; 
     $old_handler->(@_) if $old_handler; 
    }; 
} 

你也可以考慮增加一個WARN和模具的處理程序,如果你不記錄stderr的輸出。

+0

沒有別的。我有一些使用睡眠呼叫的其他腳本,但只有這一個會被殺死...... – Alex 2010-07-15 20:02:56

+0

是否有一個用於高級信號處理的Perl模塊,它可以*告訴你誰發送了這個信號? – 2010-07-15 20:04:03

+2

@讚我不認爲Unix提供這些信息。瀏覽GNU C Library關於信號處理的文檔,他們的處理程序只獲取信號編號。 http://www.gnu.org/s/libc/manual/html_node/Basic-Signal-Handling.html – Schwern 2010-07-15 20:39:59