2009-10-23 40 views
58

¿Es posible detectar Ctrl + C señal en una aplicación de línea de comandos java? Me gustaría limpiar algunos recursos antes de terminar el programa.Catching Ctrl + C en Java

Respuesta

65

Puede adjuntar un shutdown hook a la máquina virtual que consigue ejecutarse cada vez que la máquina virtual se apaga:

La máquina virtual Java se apaga en respuesta a dos tipos de eventos:

  • El programa se cierra normalmente, cuando sale el último hilo que no es daemon o cuando se invoca el método de salida (equivalentemente, System.exit) o ​​

  • The virt La máquina finaliza en respuesta a una interrupción del usuario, como escribir Ctrl + C, o un evento en todo el sistema, como cierre de sesión de usuario o sistema.

El hilo que pasar por el gancho de cierre tiene que seguir varias reglas, sin embargo, así que lea la documentación vinculada con cuidado para evitar cualquier problema. Esto incluye asegurar la seguridad de la rosca, la terminación rápida de la rosca, etc.

Además, como comenta Jesper señala, los ganchos de cierre están garantizados para funcionar en el apagado normal de la VM pero si el proceso de la VM se cancela por la fuerza no lo hacen t. Esto puede suceder si el código nativo se daña o si mata a la fuerza el proceso (kill -9, taskkill /f).

Pero en esos escenarios, todas las apuestas se cancelan de todos modos, así que no me cansaría de pensarlo demasiado.

+0

Ten en cuenta que los ganchos de cierre no están garantizados para funcionar en todas las circunstancias; puede haber situaciones en las que no se ejecutan, por lo que no debe hacer que el funcionamiento correcto de su programa dependa de lo que haga en un gancho de apagado. – Jesper

+0

No se ejecutan, cuando el proceso finaliza con fuerza ('TerminateProcess()' o 'SIGKILL') pero eso está fuera de la operación normal y dado que Ctrl + C ya está cubierto por el gancho de cierre, es seguro usarlo. No se puede hacer mucho si el SO realmente termina su proceso de todos modos. – Joey

+0

Si ejecuto 'kill' (enviando una señal TERM), ¿quedará atrapado en el gancho de apagado? (Tenga en cuenta que no es lo mismo que 'kill -9', lo que entiendo de lo anterior es que no quedará atrapado en el gancho). – ADTC

14

Sólo para fines de pruebas rápidas consola ...

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      try { 
       Thread.sleep(200); 
       System.out.println("Shouting down ..."); 
       //some cleaning up code... 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
+2

Su ejemplo es específico de RaspberryPI ('SoftPwm',' gpio'). Es posible que desee omitir esas llamadas a métodos. – harpun