为啥我的程序没有收到 SIGTERM?

Posted

技术标签:

【中文标题】为啥我的程序没有收到 SIGTERM?【英文标题】:Why my program not receive SIGTERM?为什么我的程序没有收到 SIGTERM? 【发布时间】:2012-08-10 07:24:27 【问题描述】:

我在某些服务器上使用 telnet/ssh 访问来运行特定的模拟器程序,并且该程序依赖于 SIGTERM 退出自身(如果不以交互方式输入“exit”字符串)。

当我直接终止 telnet/ssh 会话时,程序通常会在大多数服务器上自行退出。但是在某些服务器上,我的模拟器不会收到 SIGTERM 信号,并继续作为 ROOT 进程的子进程运行。那么那些悬空的进程会消耗大量的 CPU 资源。

有人可以帮我看看哪里吗?或者如何解决这种情况?

谢谢, 凯文

【问题讨论】:

如果您知道它不会在哪些服务器上正常关闭,为什么不在您注销之前明确杀死它? 正常情况下,我们会的。但是它是由自动化程序使用expect然后telnet到服务器并运行模拟器自动启动的,有时自动化程序可能由于其复杂性而无法正常退出。所以... SIGTERM 未在哪些服务器上交付?这些服务器与提供 SIGTERM 的服务器之间还有什么不同?他们运行什么操作系统和 ssh/telnet 守护程序软件?哪些版本? 【参考方案1】:

编写一个包装程序

    执行您的模拟器程序 模拟器退出时自行退出 当它成为根进程的子进程时,向模拟器发送 SIGTERM(如果没有效果,则在几秒钟后发送 SIGKILL)

这将是一个可怕的 hack,但根据您目前提供的信息,这是我能建议的最好方法。

【讨论】:

戴夫,感谢您的回答!实际上模拟器是由一个包装器启动的。我想我可以利用包装器转储包装器本身收到的信号,看看不同服务器之间是否有任何不同。我会回复你的。

以上是关于为啥我的程序没有收到 SIGTERM?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 SIGTERM

Heroku 记录 FATAL SignalException: SIGTERM

为啥我的一些视图控制器没有收到 didReceiveMemoryWarning?

为啥我的应用程序崩溃而没有任何错误?

为啥我的 iOS 应用程序在收到推送通知时会崩溃?

当我的应用程序进行电池优化时,为啥我无法收到推送通知?