Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/12/2011, 10:11
eagleoneraptor
 
Fecha de Ingreso: marzo-2009
Mensajes: 47
Antigüedad: 15 años, 1 mes
Puntos: 0
Capturar señal SIGINT (cuando se presiona Ctrl-C)

Hola, ¿que tal?

Tengo un problemilla, es el siguiente: tengo un script PHP que se ejecuta desde consola (la consola es de GNU/Linux, no es necesario que sea multiplataforma) y lo que debe ejecutar es una serie de tareas en un ciclo, la idea es que yo pueda matar el script durante su ejecución, pero quiero evitar que el script "muera" cuando se está en plena realización de una tarea, ya que es necesario que la tarea concluya.

Lo que hago yo es capturar la señal SIGINT que en teoría es la que se emite cuando presiono Ctrl-C en la terminal, al capturar esta señal (con pcntl_signal) asigno una bandera indicando que el script debe terminar. Entonces, cuando termina una tarea reviso el valor de esa bandera y corto el ciclo si es necesario, terminando el script de manera limpia.

La cosa es que el script que hice no funciona :), y no estoy seguro por qué, es el siguiente...

Código PHP:
Ver original
  1. class Command
  2. {
  3.     private $isKilled = false;
  4.    
  5.     public function signalHandler($signal)
  6.     {
  7.         echo "Señal capturada";
  8.         $this->isKilled = true;
  9.     }
  10.    
  11.     public function exec()
  12.     {
  13.         pcntl_signal(SIGINT, array(&$this, 'signalHandler'));
  14.        
  15.         while(1){
  16.             echo "Trabajo ininterrumpible...\n";
  17.             sleep(1);
  18.             if($this->isKilled){
  19.                 break;
  20.             }
  21.         }
  22.        
  23.         echo 'Saliendo...';
  24.     }
  25. }
  26.  
  27. $command = new Command();
  28. $command->exec();

El resultado de este script es que al presionar Ctrl-C el script no muere, pero tampoco parece ejecutarse signalHandler (no se imprime "Señal capturada").

¿Alguien podría decirme si estoy haciendo algo mal?
¡Muchas gracias!