Linux поддерживает отправку произвольного Posix-сигнала, такого как SIGINT
или SIGTERM
, в процесс с помощью kill
-Command. В то время как SIGINT
и SIGTERM
являются просто скучными старыми способами прекращения процесса в дружественном или не-дружественном виде, SIGQUIT
предназначен для запуска дампа ядра. Это можно использовать для запуска запущенной виртуальной машины Java для печати дампа потока, включая стек стеков всех работающих потоков - аккуратно! После печати информации об отладке Java VM продолжит делать то, что было раньше; на самом деле свалка потока происходит только в другом порожденном потоке с максимальным приоритетом. (Вы можете попробовать это самостоятельно, используя kill -3 <VM-PID>
.)
Обратите внимание, что вы также можете регистрировать свои собственные обработчики сигналов с помощью классов (неподдерживаемых!) Signal
и SignalHandler
в sun.misc
-пакете, поэтому вы можете иметь с ним всевозможные удовольствия.
Однако мне еще предстоит найти способ отправки сигнала в процесс Windows. Сигналы создаются с помощью определенных пользовательских входов: Ctrl-C
запускает a SIGINT
на обеих платформах, например. Но, похоже, нет никакой утилиты для ручного отправки сигнала на запущенный, но неинтерактивный процесс в Windows. Очевидным решением является использование исполняемого файла Cygwin kill
, но, хотя он может завершать процессы Windows с использованием соответствующего Windows API, я не мог отправить с ним SIGBREAK
(эквивалент Windows SIGQUIT
); на самом деле я думаю, что единственным сигналом, который он может отправить на процессы Windows, является SIGTERM
.
Итак, чтобы сделать длинный рассказ коротким и повторить заголовок: Как отправить произвольный сигнал процессу в Windows?