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