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