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
Respuesta
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:
¿Los ganchos de apagado incluso se ejecutan cuando la JVM finaliza de forma anormal? Yo lo dudaría. –
@mmyers, eso depende de su definición de anormal. :) Ctrl-C generalmente los activará. Cerrar el terminal generalmente no. – jsight
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
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.
- 1. Catching Ctrl + C en Java
- 2. Java Voting System
- 3. ¿Cómo funciona el CTRL-C con el programa Java
- 4. Dejar de repetir^C en la terminal
- 5. ScheduledThreadPoolExecutor, cómo dejar de JAVA clase ejecutable
- 6. Ctrl + - (Ctrl + Hyphen-Minus) como tecla de abreviatura?
- 7. C++ std :: system 'system' no es un miembro de std
- 8. Ratón Entrar ¿Dejar mensajes que no funcionan?
- 9. ¿Cómo evito que un compilador de optimización interrumpa las secciones críticas sin interrupción?
- 10. Vim: Eclipse-como Ctrl-Retroceso y Ctrl-Del
- 11. ¿Cómo finaliza Ctrl-C un proceso hijo?
- 12. TerminateProcess vs Ctrl + C
- 13. Invalidar Ctrl-C
- 14. C# Command Run remote System
- 15. GDB: Ctrl + C no interrumpe el proceso como suele hacerlo, sino que termina el programa
- 16. Enviar Ctrl-C al proceso abierto por Java
- 17. ¿Cómo reenvío declarar HANDLE? (Win32)
- 18. Scala y Java Real-Time System
- 19. cómo dejar que tor cambie ip automáticamente?
- 20. BASH - usando trampa Ctrl + C
- 21. ¿Cuál es la diferencia entre Ctrl + C y Ctrl + [?
- 22. Android Handle phone call
- 23. Captura Ctrl-C en rubí
- 24. C++ Dejar que un hilo de refuerzo espere 1 segundo
- 25. CTRL + C/CTRL + V no funcionan en Eclipse
- 26. ¿Cómo envío ctrl + c a un proceso en C#?
- 27. ¿Cómo puedo "interceptar" Ctrl + C en una aplicación CLI?
- 28. vim: mapeo ctrl-0 a ctrl-9?
- 29. enumeración C-como en Java
- 30. Handle Push Notifications
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