yon*_*nny 3 java unix shell copy-paste
我发现了一个奇怪的场景,如果我启动一个 java 程序并且我想用CTRL+优雅地退出C它不起作用/响应,我必须在程序上做一个CTRL+Z这并不酷,做一个 ps 列出了进程。 ..任何人请。
在 Unix 下,命令行程序对当您尝试使用^C. ^C在终端打字的默认效果是让内核将SIGINT信号发送到前台进程组,默认行为是SIGINT是杀死它发送到的进程,但这两者都可以改变。
您的问题最可能的原因是您的 Java 程序正在拦截SIGINT以在退出前进行一些清理,但信号处理程序有问题,因此该进程实际上从未退出。第二个最可能的原因是程序完全忽略 SIGINT了。最不可能的原因是它将终端置于“原始模式”,以便^C仅将值为 0x03 的字节传送到其标准输入(如果这样做了,那^Z可能也不起作用)。
如果您可以访问程序的源代码,则可以尝试修复有问题的信号处理程序和/或使其停止忽略信号。否则,你有点像一条小溪。您可以尝试^\(control-backslash),它发送不同的正常致命信号 ( SIGQUIT),但这也不能保证有效,如果有效,它可能会给您留下一个巨大的“核心转储”文件以摆脱的。
唯一 100% 确定摆脱故障过程的方法是向其发送信号 9 ( SIGKILL)。与其他致命信号不同,拦截、阻止或忽略它是不可能的。没有控制键发送信号9;您必须使用 暂停进程^Z,或者打开一个新的终端窗口/ssh 会话,使用 找到进程 ID ps,然后使用该kill命令。kill PID之前总是尝试kill -9 PID。