Удалить перехватчик завершения другого процесса Java

У меня есть приложение Java, которое я хочу корректно завершить в Windows. Я запускаю это приложение, используя файл .bat, и могу корректно остановить его, если нажму CTRL + C с клавиатуры. Отправить сигнал SIGINT / SIGTERM приложению в Linux очень просто. Я хочу сделать что-то подобное в Windows.

До сих пор я пробовал использовать командный файл, но могу попробовать только команду taskkill, которая внезапно завершает работу приложения.

Я попытался написать скрипт на Python со следующими командами:

  1. GenerateConsoleCtrlEvent -

    GenerateConsoleCtrlEvent(win32con.CTRL_C_EVENT, <my_process_id>)
    

    Проблема с этим подходом в том, что ему нужен идентификатор группы процессов вместо идентификатора процесса. Думаю, он будет таким же, как идентификатор процесса. Но нельзя сказать, что параметр неверен.

  2. os.kill -

    os.kill(pid, signal.CTRL_C_EVENT)
    

    Эта команда внезапно убивает мой процесс, вероятно, потому, что мой процесс не является подпроцессом python.

Я попытался сделать это с помощью VBScript, используя команду завершения, указанную в следующей ссылке: Как завершить процесс с помощью VBScript

Но не повезло. Я не хочу использовать для этого стороннее приложение, такое как SendKeys.

Сейчас я пытаюсь написать программу, которая может-

  1. Получите список потоков, которые выполняются в java-процессе, созданном моим приложением.
  2. Получите имя потока, который я хочу передать в качестве параметра removeShutdownHook (thread_name)
  3. Удалите ловушку выключения, вызвав

    Runtime.getRuntime().removeShutdownHook(<my_thread_name>);
    

Я попытался получить сведения о потоке, как указано в следующей ссылке Получить список всех потоков, запущенных в настоящее время на Java

но он дает мне потоки, которые выполняются в моем текущем процессе.

Я борюсь с этой проблемой последние 2 дня. Есть ли способ удалить крючок выключения другого процесса в java в Windows?

Заранее спасибо!!

Обновление 1 - я должен использовать Java 6.

Обновление 2 - ответ, указанный в следующей ссылке Как изящно обрабатывать сигнал SIGKILL в Java

не сработает для меня, так как он предлагает добавить ловушку выключения, которая у меня уже есть в моем приложении. Я хочу удалить его из другого приложения, получив имя потока.


person blu3    schedule 18.11.2016    source источник
comment
@ jim-garrison Спасибо за ссылку, но ответ здесь касается Linux. Кроме того, как указано выше, в моем приложении уже есть ловушка отключения. Я хочу удалить его с помощью другой программы вне моего приложения.   -  person blu3    schedule 18.11.2016
comment
Вы не сможете проникнуть в Java-процесс извне, если не встроите механизм IPC в целевую программу (ту, которую вы хотите контролировать извне). Вам нужно будет запустить поток, прослушивающий сокет или канал, и разрешить внешней программе подключиться и отправить соответствующее сообщение, которое затем будет обработано.   -  person Jim Garrison    schedule 18.11.2016
comment
@JimGarrison Поможет ли демонстрация его как MBean на порте jmx?   -  person blu3    schedule 18.11.2016
comment
Да, это могло быть одним из способов.   -  person Jim Garrison    schedule 18.11.2016
comment
@JimGarrison Итак, как я теперь понимаю, нет способа заставить потоки запускаться другим java-процессом с помощью java-программы. Кроме того, я не думаю, что это возможно и на любом языке сценариев. Пожалуйста, предложите, правильно ли я понимаю.   -  person blu3    schedule 18.11.2016
comment
Не используя стандартную Java. Я понятия не имею, можно ли использовать JNI, но подозреваю, что не без доступа корневого уровня (администратора в терминах Windows). Даже в этом случае настройка потоков процесса извне будет серьезным нарушением безопасности и сделает возможными всевозможные вредоносные программы. Либо напишите свой собственный механизм управления, либо используйте JMX (что почти одно и то же).   -  person Jim Garrison    schedule 18.11.2016
comment
@Jim: Весь «удаленный» доступ JMX на машине требует одного и того же идентификатора пользователя, и между машинами можно настроить различные параметры JAAS и SSL. + blu3: Стандартный / встроенный ThreadMXBean, доступный как локально, так и удаленно, позволяет вам получать довольно много информации, но не включая ловушку выключения, и не позволяет вам ничего менять. Так что да, вам нужен собственный mbean. Однако я не понимаю, как удаление ловушки выключения помогает в достижении поставленной вами цели - «корректно завершить завершение работы».   -  person dave_thompson_085    schedule 18.11.2016