当前位置: 首页 > 面试题库 >

Windows上除SIGKILL以外的其他信号无法终止进程

吕霖
2023-03-14
问题内容

我正在通过Go启动一个简单的Javahtml" target="_blank">应用程序,目的是证明Go可以发送诸如SIGQUIT或SIGTERM之类的信号,而Java可以捕获并适当地处理它(即正常关闭)。当我在命令行上运行Java程序并将其发送给CTRL
+ C时,Java程序正确捕获了信号。

但是,当我通过Go启动Java程序并尝试向进程发送信号时,Java进程既不会终止也不会处理信号。唯一起作用的是SIGKILL,它当然不会被捕获,只会杀死进程。

这是我的Go代码的相关部分:

开始:

startChan := make(chan bool)
go func(startChan chan<- bool) {
    a.Cmd = exec.Command("java", "-jar", "C:\\Code\\sigterm\\TestApp.jar")
    a.Cmd.Stdout = os.Stdout
    a.Cmd.Stderr = os.Stderr

    launchErr := a.Cmd.Start()
    if launchErr != nil {
        fmt.Println("Unable to start app:" + launchErr.Error())
    }
    startChan <- true
}(startChan)

停止:

func (a *App) Stop(timeout time.Duration) {
  a.Cmd.Process.Signal(syscall.SIGQUIT) //Does not work
  a.Cmd.Process.Signal(syscall.SIGTERM) //Does not work
  a.Cmd.Process.Signal(syscall.SIGKILL) //Works
}

顺便说一句,这是在Windows上。我通过启动另一个程序(记事本)进行了尝试,并得到了相同的结果。也就是说,只有SIGKILL可以工作。我已经确认Go正在获取正确的PID,依此类推,因此信号应该到达正确的位置。

关于如何使它起作用的任何想法?


问题答案:

如文档中所述,似乎不支持此功能:

https://godoc.org/os#Process.Signal

在Windows上未实现发送中断。

另外,请参阅此问题讨论以获取有关为何无法完成操作的更多信息:

https://github.com/golang/go/issues/6720



 类似资料:
  • 问题内容: 在POSIX系统上,终止信号通常具有以下顺序(根据许多MAN页和POSIX规范): SIGTERM-礼貌地要求进程终止。它应正常终止,清理所有资源(文件,套接字,子进程等),删除临时文件等。 SIGQUIT-更有力的要求。它会终止不合时宜的情况,仍然清理绝对需要清理的资源,但可能不会删除临时文件,可能会在某些地方写入调试信息;在某些系统上,还将写入核心转储(无论信号是否被应用捕获)。

  • 我正在开发一款通过蓝牙记录数据的应用程序,但在收集数据数小时后,它会间歇性崩溃(这使得追踪错误变得很困难)。 logcat 输出不是很有帮助: http://i.imgur.com/EalnX.png 没有引发异常,也没有导致进程终止的线索。 我怎样才能弄清楚哪里出了问题?是否存在未由 logcat 显示的异常?如何跟踪此错误?

  • 有一些类似的问题,但没有一个答案对我不起作用。

  • 我的进程在linux服务器上被杀,无需人工干预。我已经验证了以下场景。 用户或管理员均未进行手动干预以杀死 该进程占用16.5GB的虚拟内存,其中RAM为16GB,交换为50GB。 任务:总共393个,2个跑步,387个睡觉,4个停止,0个僵尸 Cpu:12.8%us,0.5%sy,0.0%ni,86.7%id,0.0%wa,0.0%hi,0.0%si,0.0%st 内存:总共16015M,使用8

  • 我有一个单线程进程,它不会在终止条件下死亡。处理信号掩码未显示SIGTERM被阻塞。我以root身份执行“kill”。我可以使用SIGKILL终止进程,但这是更大系统的一部分,我希望SIGTERM能够工作。 注意Sig*属性。SigCgt、SigIgn和SigBlk表示SIGTERM既没有被捕获、忽略或阻塞(第15位未设置-将最低有效位计算为#1)。由于SIGTERM的默认配置是终止进程,我希望它

  • 问题内容: 我需要在接收到任何终止命令(如SIGTERM和SIGKILL)时写入日志文件。 我可以注册SIGTERM,但是如何处理SIGKILL信号? 问题答案: 您不能,至少不是因为进程被杀死。 您 可以 做的是安排父进程监视子进程的死亡,并采取相应的措施。任何体面的过程监控系统(例如daemontools)都内置了这样的工具。