2011-10-23 8 views
8

Ho uno script in esecuzione sullo sfondo del mio server Linux e vorrei cogliere i segnali, come il riavvio o qualsiasi cosa che avrebbe ucciso questo script e invece salvare tutte le informazioni Importante prima di poter realmente uscire.Come posso rilevare un segnale KILL o HUP o User Abort?

Credo che la maggior parte di quello che ho bisogno di prendere è, SIGINT, SIGTERM, SIGHUP, SIGKILL.

Come catturare uno di questi segnali e farlo eseguire una funzione di uscita altrimenti continua a eseguire qualunque cosa stia facendo?

pseudo codice 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); 
} 

pseudo codice 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

risposta

15

PHP usa pcntl_signal per registrare un gestore di segnale, in modo da qualcosa di simile:

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

lo proveremo grazie ... così in modo basilare verrebbe assegnato al gestore e catturato anche se ho un infinito mentre gira da qualche parte nel codice giusto? – Prix

+0

@Prix: Sì, dovrebbe succedere. Ma fai attenzione alle note di Ikegami su SIGKILL e leggi i documenti (http://php.net/manual/en/function.pcntl-signal.php) per ulteriori informazioni. –

+0

'# Solo per lo spettacolo, non lo catturerai. Non solo, ma ricevi ancora un messaggio di avvertimento su di esso durante l'esecuzione del codice. Il riposo funziona piuttosto bene, grazie. – Prix

1

Per la versione Perl, vedere perldoc -q signal - fondamentalmente, impostare $SIG{signal} ad un riferimento secondario.

+1

'perldoc perlvar' sarebbe un altro buon riferimento: http://perldoc.perl.org/perlvar.html# % 25SIG –

+0

Oh, giusto. Mi sono totalmente infastidito. –

+0

Il 'perldoc -q signal' non mi dice enouch sapere come sono enumerate le opzioni da usare e come tale la tua risposta non mi aiuta molto ma grazie comunque. @mu è troppo corto Il link di riferimento che hai pubblicato è ottimo, mostra tutto ciò che non ha funzionato. – Prix

5

Perl:

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

SIGKILL non può essere catturato. Non è inviato al processo.

%SIG è documentato in perlvar. Vedi anche perlipc

+0

Sembra buono ma "kill -9 pid' rientra in INT o SIGKILL? Principalmente uso kill-HUP per terminare il processo e da quello che so il riavvio invia un segnale TERM ma vorrebbe essere al sicuro contro chiunque altro cerchi di ucciderlo. – Prix

+3

@Prix: 9 è SIGKILL. Prova 'kill -l' se stai usando bash, che ti darà una lista di segnali insieme ai loro numeri. Ctrl + C è SIGINT. –

Problemi correlati