CTRL-C不适用于Java程序

时间:2010-07-06 14:40:40

标签: java unix shell copy-paste

我发现了一个奇怪的场景,如果我启动一个java程序并且我想要优雅地退出 CTRL + C 它不起作用/响应,我必须在程序上执行 CTRL + Z 并且这不是很酷,做一个ps列出过程......任何人都可以。

2 个答案:

答案 0 :(得分:4)

在Unix下,命令行程序可以很好地控制当您尝试使用^C中断它们时会发生什么。在终端上键入^C的默认效果是使内核将SIGINT信号发送到前台进程组,SIGINT的默认行为是终止它发送到的进程,但这两件事都可以改变。

您问题的最可能原因是您的Java程序正在拦截SIGINT以便在退出之前进行一些清理,但是信号处理程序是错误的,因此该进程实际上并未实际退出。第二个最可能的原因是该程序完全忽略 SIGINT。并且最不可能的原因是它将终端置于“原始模式”,以便^C只将值为0x03的字节传递给其标准输入(如果它已经完成^Z可能不起作用任一)。

如果您可以访问程序的源代码,您可以尝试修复错误的信号处理程序和/或使其停止忽略信号。否则,你就像一条小溪。您可以尝试^\(控制反斜杠),它会发送一个不同的正常致命信号(SIGQUIT),但这不保证可以正常工作,如果是的话工作,它可能会留下一个巨大的“核心转储”文件,以摆脱。

唯一能够摆脱故障过程的100%是发送信号9(SIGKILL)。与其他致命信号不同,它不可能拦截,阻止或忽略那个。没有控制键发送信号9;您必须使用^Z挂起该进程,或者打开一个新的终端窗口/ ssh会话,找到带有ps的进程ID,并使用kill命令。始终在kill PID之前尝试kill -9 PID

答案 1 :(得分:0)

我遇到了同样的问题(就我而言是问题:)),我的问题是我使用 javaw 而不是 java 启动了应用程序。

javaw 在没有控制台的情况下运行应用程序,因此 CTRL+C 不起作用。

关于 javawjava 之间区别的另一个问题 - What is the difference between 'java', 'javaw', and 'javaws'?