为什么我的程序没有收到SIGTERM?

问题描述:

我在某些服务器上使用telnet/ssh seesion来运行特定的模拟器progrmam,并且程序依靠SIGTERM退出本身(如果不是以交互方式输入“exit”字符串)。为什么我的程序没有收到SIGTERM?

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

有没有人可以给我一些帮助在哪里看?或者如何解决这种情况?

感谢, 凯文

+0

如果您知道哪些服务器无法正常关闭,为什么不在注销之前明确地将其关闭? – 2012-08-10 07:29:08

+0

通常情况下,我们会。但是它是由自动化程序自动启动的,然后使用expect然后telnet到服务器并运行模拟器,有时自动化程序可能由于其复杂性而不能正常退出。所以... – 2012-08-10 07:30:51

+0

什么服务器SIGTERM没有交付?这些服务器和那些提供SIGTERM的服务器有什么不同?他们运行什么操作系统和ssh/telnet守护进程软件?哪些版本? – dave4420 2012-08-10 08:51:39

编写

  1. 执行你的模拟器程序的包装程序
  2. 当模拟器退出,退出本身
  3. 当它成为根进程的孩子,发送SIGTERM到模拟器(然后SIGKILL几秒钟后如果没有效果)

这将是一个可怕的黑客,但它是我可以根据您提供的信息迄今为止最好的。

+0

Dave,谢谢你的回答!实际上模拟器是由一个包装器启动的。我认为我可以利用包装器将包装器本身收到的信号转储出来,以查看不同服务器之间是否有任何不同。我会尽快给您回复。 – 2012-08-12 13:57:53