У меня есть приложение Java, которое я хочу корректно завершить в Windows. Я запускаю это приложение, используя файл .bat, и могу корректно остановить его, если нажму CTRL + C с клавиатуры. Отправить сигнал SIGINT / SIGTERM приложению в Linux очень просто. Я хочу сделать что-то подобное в Windows.
До сих пор я пробовал использовать командный файл, но могу попробовать только команду taskkill, которая внезапно завершает работу приложения.
Я попытался написать скрипт на Python со следующими командами:
GenerateConsoleCtrlEvent -
GenerateConsoleCtrlEvent(win32con.CTRL_C_EVENT, <my_process_id>)
Проблема с этим подходом в том, что ему нужен идентификатор группы процессов вместо идентификатора процесса. Думаю, он будет таким же, как идентификатор процесса. Но нельзя сказать, что параметр неверен.
os.kill -
os.kill(pid, signal.CTRL_C_EVENT)
Эта команда внезапно убивает мой процесс, вероятно, потому, что мой процесс не является подпроцессом python.
Я попытался сделать это с помощью VBScript, используя команду завершения, указанную в следующей ссылке: Как завершить процесс с помощью VBScript
Но не повезло. Я не хочу использовать для этого стороннее приложение, такое как SendKeys.
Сейчас я пытаюсь написать программу, которая может-
- Получите список потоков, которые выполняются в java-процессе, созданном моим приложением.
- Получите имя потока, который я хочу передать в качестве параметра removeShutdownHook (thread_name)
Удалите ловушку выключения, вызвав
Runtime.getRuntime().removeShutdownHook(<my_thread_name>);
Я попытался получить сведения о потоке, как указано в следующей ссылке Получить список всех потоков, запущенных в настоящее время на Java
но он дает мне потоки, которые выполняются в моем текущем процессе.
Я борюсь с этой проблемой последние 2 дня. Есть ли способ удалить крючок выключения другого процесса в java в Windows?
Заранее спасибо!!
Обновление 1 - я должен использовать Java 6.
Обновление 2 - ответ, указанный в следующей ссылке Как изящно обрабатывать сигнал SIGKILL в Java
не сработает для меня, так как он предлагает добавить ловушку выключения, которая у меня уже есть в моем приложении. Я хочу удалить его из другого приложения, получив имя потока.