为什么我的程序没有收到SIGTERM?
问题描述:
我在某些服务器上使用telnet/ssh seesion来运行特定的模拟器progrmam,并且程序依靠SIGTERM退出本身(如果不是以交互方式输入“exit”字符串)。为什么我的程序没有收到SIGTERM?
当我直接杀死telnet/ssh会话时,程序通常会在大多数服务器上退出。但是在某些服务器上,我的模拟器不会收到SIGTERM信号,并继续作为ROOT进程的子进程运行。那些悬挂的进程将消耗大量的CPU资源。
有没有人可以给我一些帮助在哪里看?或者如何解决这种情况?
感谢, 凯文
答
编写
- 执行你的模拟器程序的包装程序
- 当模拟器退出,退出本身
- 当它成为根进程的孩子,发送SIGTERM到模拟器(然后SIGKILL几秒钟后如果没有效果)
这将是一个可怕的黑客,但它是我可以根据您提供的信息迄今为止最好的。
+0
Dave,谢谢你的回答!实际上模拟器是由一个包装器启动的。我认为我可以利用包装器将包装器本身收到的信号转储出来,以查看不同服务器之间是否有任何不同。我会尽快给您回复。 – 2012-08-12 13:57:53
如果您知道哪些服务器无法正常关闭,为什么不在注销之前明确地将其关闭? – 2012-08-10 07:29:08
通常情况下,我们会。但是它是由自动化程序自动启动的,然后使用expect然后telnet到服务器并运行模拟器,有时自动化程序可能由于其复杂性而不能正常退出。所以... – 2012-08-10 07:30:51
什么服务器SIGTERM没有交付?这些服务器和那些提供SIGTERM的服务器有什么不同?他们运行什么操作系统和ssh/telnet守护进程软件?哪些版本? – dave4420 2012-08-10 08:51:39