【发布时间】:2010-09-13 11:56:14
【问题描述】:
Linux 支持使用 kill-Command 向进程发送任意 Posix 信号,例如 SIGINT 或 SIGTERM。虽然SIGINT 和SIGTERM 只是以友好或不那么友好的方式结束进程的无聊旧方法,但SIGQUIT 旨在触发核心转储。这可用于触发正在运行的 Java VM 打印出线程转储,包括所有正在运行的线程的堆栈跟踪——太棒了!打印调试信息后,Java VM 将继续执行之前的操作;事实上,线程转储只是发生在另一个具有最高优先级的衍生线程中。 (您可以使用kill -3 <VM-PID> 自己尝试一下。)
请注意,您还可以使用 sun.misc-package 中的(不支持!)Signal 和 SignalHandler 类注册自己的信号处理程序,这样您就可以享受各种乐趣。
但是,我还没有找到向 Windows 进程发送信号的方法。 信号是由某些用户输入创建的:例如,Ctrl-C 在两个平台上都会触发 SIGINT .但似乎没有任何实用程序可以手动向 Windows 上正在运行但非交互式进程发送信号。显而易见的解决方案是使用 Cygwin kill 可执行文件,但是虽然它可以使用适当的 Windows API 结束 Windows 进程,但我无法使用它发送 SIGBREAK(相当于 SIGQUIT 的 Windows);事实上,我认为它能够发送到 Windows 进程的唯一信号是SIGTERM。
所以,长话短说并重复标题:如何向 Windows 中的进程发送任意信号?
【问题讨论】:
-
Sun 警告不要在 com.sun 层次结构中使用类,因为它们可以(并且确实)在版本之间,有时甚至在平台之间任意更改。
-
我知道,这就是我写 unsupported(感叹号)的原因。这只是一个旁白,并不是问题的核心。
-
我正在寻找自己生成堆栈转储...太糟糕了 Sun 没有从 Java 托盘图标中添加这种可能性。