Cygwin CTRL-C (Прерывания сигнала) не работает должным образом - JVM Shutdown Крючки не запускаются
Я работаю над Java-приложением, использующим крюки остановки, чтобы очистить процесс прерывания/прерывания программы, но я заметил, что реализация CTRL-C в Cygwin, похоже, не запускает крючки отключения. На первый взгляд, он прервал процесс, отказавшись от управления обратно в командную строку, однако процесс "выключения" не запускается вообще, поэтому очистка не происходит.
В cmd они попадают, но из-за различных ограничений мне нужно как-то заставить их работать в Cygwin.
Есть ли способ запустить SIGINT в запущенном процессе через Cygwin вообще или, возможно, альтернативу крючкам отключения, которые я мог бы использовать для очистки при прерывании и завершении?
Ответы
Ответ 1
Bash вызывает исполняемые файлы non-cygwin (windows) через промежуточный процесс bash (bash shell → bash → java). Когда вы набираете Ctrl-C, процесс bash получает SIGINT и убивает дочерний java-процесс, поэтому крючки отключения не вызываются. Процессы Windows не знают о сигналах, таких как SIGINT, SIGTERM или SIGKILL.
Как описано в документации - Xrs, процесс java регистрирует обработчик управления консолью для события Windows CTRL_C_EVENT и запускает изящное завершение который вызывает крючки остановки. Чтобы заставить Ctrl-C работать так, как ожидалось, вам нужно убедиться, что процесс java получает его, но прямо сейчас, что перехвачен bash и не передается дочернему процессу.
Эта проблема может быть пересчитана как: Как я могу передать Cygwin Ctrl-C в процессы консоли Windows?
Примечание. Поведение bash, описанное выше, было проверено в версии 1.7.25.
Ответ 2
Этот поток, возможно, пролил некоторый свет. Некоторые параметры
timeout 1d <command>
или
Патч Ctrl-C от Howard Chu