2011-10-23 20 views
8

我有我的Linux服務器的後臺運行的腳本,我想趕上像重啓或任何會殺死這個腳本,而是真正退出之前任何重要提示信息保存信號。如何捕獲KILL或HUP或用戶中止信號?

我想大多數的什麼,我需要捕捉的,SIGINT,SIGTERM,SIGHUP,SIGKILL。

如何捕捉任何這些信號,並已就執行退出功能,否則繼續執行不管它在做什麼?

僞Perl代碼:

#!/usr/bin/perl 

use stricts; 
use warnings; 

while (true) 
{ 
    #my happy code is running 
    #my happy code will sleep for a few until its breath is back to keep running. 
} 

#ops I have detected an evil force trying to kill me 
#let's call the safe exit. 
sub safe_exit() 
{ 
    # save stuff 
    exit(1); 
} 

僞PHP代碼:

<?php 

while (1) 
{ 
    #my happy code is running 
    #my happy code will sleep for a few until its breath is back to keep running. 
} 

#ops I have detected an evil force trying to kill me 
#let's call the safe exit. 

function safe_exit() 
{ 
    # save stuff 
    exit(1); 
} 
?> 
+0

http://stackoverflow.com/questions/5180539/quick-perl-sigint-handler – daxim

回答

15

PHP使用pcntl_signal註冊一個信號處理程序,所以是這樣的:

declare(ticks = 1); 

function sig_handler($sig) { 
    switch($sig) { 
     case SIGINT: 
     # one branch for signal... 
    } 
} 

pcntl_signal(SIGINT, "sig_handler"); 
pcntl_signal(SIGTERM, "sig_handler"); 
pcntl_signal(SIGHUP, "sig_handler"); 
# Nothing for SIGKILL as it won't work and trying to will give you a warning. 
+0

會試用它,謝謝...基本上它會被分配給處理程序,並且即使在代碼中運行某處時有無限的時間也會被捕獲。 – Prix

+0

@Prix:是的,應該發生。但請注意ikegami關於SIGKILL的筆記,並閱讀文檔(http://php.net/manual/en/function.pcntl-signal.php)以獲取更多信息。 –

+0

'#只是爲了展示,你不會理解這一點。「不僅如此,在運行代碼時你仍然會收到關於它的警告消息。休息很好,謝謝。 – Prix

1

對於perl的版本,請參閱perldoc -q signal - 基本上,設置$SIG{signal}到子參考。

+1

'的perldoc perlvar'將是另一個很好的參考:http://perldoc.perl.org/perlvar.html# %25SIG –

+0

哦,對。我完全是因爲這個而腦筋急轉彎。 –

+0

'perldoc -q信號'並不能告訴我知道如何使用這些選項,因此您的回覆對我的幫助不大,但是無論如何感謝。 @mu太短你發佈的引用鏈接很棒,確實顯示了上面沒有的內容。 – Prix

5

的Perl:

@SIG{qw(INT TERM HUP)} = \&safe_exit; 

SIGKILL不能被捕獲。它不被髮送到流程。

%SIGperlvar記錄。另請參見perlipc

+0

看起來不錯,但'kill -9 pid'屬於INT還是SIGKILL?我主要使用kill -HUP來完成該過程,並且從我知道的重新啓動發送一個TERM信號,但希望對任何試圖殺死它的人都是安全的。 – Prix

+3

@Prix:9是SIGKILL。如果您使用bash,請嘗試'kill -l',這會給您一個信號列表及其數字。 Ctrl + C是SIGINT。 –