2011-10-23 21 views
8

Tengo una secuencia de comandos ejecutándose en el fondo de mi servidor Linux y me gustaría detectar señales como reiniciar o cualquier cosa que mataría a esta secuencia de comandos y, en su lugar, guardar cualquier información importante antes de salir realmente.¿Cómo capturo una señal de KILL o HUP o cancelación de usuario?

Creo que la mayoría de lo que necesito atrapar es SIGINT, SIGTERM, SIGHUP, SIGKILL.

¿Cómo captar cualquiera de estas señales y hacer que ejecute una función de salida o de lo contrario seguir ejecutando lo que estaba haciendo?

seudo código 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); 
} 

seudo código 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

Respuesta

15

PHP usa pcntl_signal registrar un manejador de señales, así que algo como esto:

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 intentaré gracias ... tan básico que se asignaría al controlador y atrapado, incluso si tengo un infinito mientras se ejecuta en algún lugar del código, ¿verdad? – Prix

+0

@Prix: Sí, eso debería suceder. Pero preste atención a las notas de ikegami en SIGKILL y lea los documentos (http://php.net/manual/en/function.pcntl-signal.php) para obtener más información. –

+0

'# Solo para mostrar, no lo detectará. No solo eso, pero aún recibirá un mensaje de advertencia al ejecutar el código. El resto funciona bastante bien gracias. – Prix

1

Para la versión Perl, ver perldoc -q signal - básicamente, establece $SIG{signal} a una referencia de sub.

+1

'perldoc perlvar' sería otra buena referencia: http://perldoc.perl.org/perlvar.html# % 25SIG –

+0

Oh, correcto. He tenido una gran impresión sobre eso. –

+0

El 'perldoc -q signal' no me dice enouch saber cómo se enumeran las opciones se van a utilizar y, como tal, su respuesta no me ayuda mucho, pero gracias de todos modos. @mu es demasiado corto El enlace de referencia que publicó es excelente, muestra todo lo que no se menciona anteriormente. – Prix

5

Perl:

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

SIGKILL no puede ser capturado. No se envía al proceso.

%SIG está documentado en perlvar. Consulte también perlipc

+0

Parece bueno, pero 'kill -9 pid' cae en INT o SIGKILL? Principalmente uso kill -HUP para terminar el proceso y, por lo que sé, el reinicio envía una señal TERM, pero me gustaría estar a salvo de cualquier otra persona que intente matarlo. – Prix

+3

@Prix: 9 es SIGKILL. Intenta 'kill -l' si estás utilizando bash, que te dará una lista de señales junto con sus números. Ctrl + C es SIGINT. –

Cuestiones relacionadas