2009-08-04 24 views
7

Tengo un programa java que crea un archivo de bloqueo para garantizar que no se ejecuten otras ejecuciones al mismo tiempo. Si el programa se ejecuta, crea el archivo, y al salir, ya sea con éxito o mediante una excepción, el archivo se elimina. Pero si el usuario presiona Ctrl + C, cierra el terminal o de alguna otra forma interrumpe la ejecución, el archivo no se elimina. ¿Hay alguna forma de detectar este comando de interrupción y asegurar que el archivo también se elimine en este caso?Cómo dejar que Java Handle System interrumpa Como Ctrl + C

+0

Irónicamente, me olvidé de esta pregunta y [respondí] (https://stackoverflow.com/a/34188676/113632) una relacionada con seis años (y la experiencia asociada del mundo real) más adelante. @Amber tiene toda la razón en que la mayoría de las aplicaciones Java deberían estar utilizando los ganchos de cierre, pero para * en realidad * manejar 'SIGINT' y otras señales que necesita usar' sun.misc.Signal', como se discutió en la pregunta vinculada. – dimo414

Respuesta

5

Es posible que desee mirar en shutdown hooks.

Además, este es probablemente un duplicado o casi duplicado de esta pregunta anterior SO de un día o dos atrás:

How can I "intercept" Ctrl+C in a CLI application?

+0

¿Los ganchos de apagado incluso se ejecutan cuando la JVM finaliza de forma anormal? Yo lo dudaría. –

+0

@mmyers, eso depende de su definición de anormal. :) Ctrl-C generalmente los activará. Cerrar el terminal generalmente no. – jsight

+1

No hay manera 100% infalible de eliminar tales archivos de bloqueo. Marcarlos de vez en cuando puede ayudar, pero tiene el costo de tener que escribir ese disco cada pocos segundos. Muchos programas solo buscan un archivo de bloqueo cuando se inician y le preguntan al usuario al respecto. – Amber

2

La única buena manera de lidiar con esto es a marca de tiempo del archivo de registro y actualice el archivo de registro con una nueva marca de tiempo cada pocos segundos. File.deleteOnExit ayudará, pero ningún método es infalible (¿qué sucede cuando alguien simplemente tira del cable de alimentación?).

Si escribe una marca de tiempo, puede verificar si hay una marca de tiempo válida (recientemente escrita) y sobrescribir el archivo de registro si está muy desactualizado. De esta forma, un archivo de bloqueo obsoleto no se interpondrá en el camino del usuario.