当前位置: 代码迷 >> java >> CTRL-C 不适用于 Java 程序
  详细解决方案

CTRL-C 不适用于 Java 程序

热度:14   发布时间:2023-07-25 19:42:29.0

我发现了一个奇怪的场景,如果我启动一个 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 会话,用ps找到进程 ID,然后使用kill命令。 总是在kill -9 PID之前尝试kill PID kill -9 PID

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

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

关于javawjava之间区别的另一个问题 -

  相关解决方案