【问题标题】:Cygwin CTRL-C (Signal Interrupts) not working properly - JVM Shutdown Hooks not startingCygwin CTRL-C(信号中断)无法正常工作 - JVM 关闭挂钩未启动
【发布时间】:2012-08-01 10:49:28
【问题描述】:

我正在开发一个 Java 应用程序,该应用程序利用关闭挂钩来清理程序的终止/中断,但我注意到 Cygwin 的 CTRL-C 实现似乎不会触发关闭挂钩。从表面上看,它似乎中断了进程,将控制权交还给命令行,但根本没有触发进程的关闭挂钩,因此不会发生清理。

在 cmd 中他们被抓住了,但由于各种限制,我需要以某种方式让他们在 Cygwin 中工作。

有没有什么方法可以通过 Cygwin 在正在运行的进程中触发 SIGINT,或者是否可以替代关闭挂钩来清理中断和终止?

【问题讨论】:

  • 奇怪,我可以在 python 中捕获 SIGINT,在 cygwin 中,没有问题。查看stackoverflow.com/questions/1028687/… 了解其他想法。
  • 这很奇怪,我的尝试关闭了进程,但如果一个 SIGINT 被设置,我的 Java 应用程序的关闭挂钩肯定没有捕捉到它 - 程序退出但清理不执行。不过,我会看看那个帖子,谢谢。

标签: java cygwin interrupt sigint shutdown-hook


【解决方案1】:

Bash 通过中间 bash 进程(bash shell -> bash -> java)调用非 cygwin (windows) 可执行文件。当您键入 Ctrl-C 时,bash 进程会收到一个 SIGINT 并杀死子 java 进程,因此不会调用关闭挂钩。 Windows 进程不知道 SIGINT、SIGTERM 或 SIGKILL 等信号。

如-Xrs 选项文档中所述,java 进程为 CTRL_C_EVENT windows 事件注册一个控制台控制处理程序,并触发调用关闭挂钩的优雅终止。要让 Ctrl-C 按预期工作,您需要确保 java 进程接收到它,但现在它被 bash 拦截并且没有传递给子进程。

这个问题可以重述为:如何让 Cygwin 将 Ctrl-C 转发给 Windows 控制台进程?

注意:上述 bash 行为已在 1.7.25 版本上得到验证。

【讨论】:

  • 底线,是cygwin问题,不是java问题。
【解决方案2】:

This thread 或许能有所启发。一些选项

timeout 1d <command>

或

Ctrl-C patch by Howard Chu

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2022-12-01
    • 2021-06-16
    • 2015-07-02
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多