从shell避免僵尸进程?

我正在写几个shell脚本来做一些事情:

  1. main.sh在屏幕下运行,它设置了一些variables,然后在前台调用: start.sh (no&)
  2. 它运行start.sh ,它设置一些Java特定的variables,并启动一个Java进程(再次在前台
  3. Java运行并执行它的事情,直到收到一个“退出”命令。 (也在前台

    所以我的过程树如下所示:

   -  main.sh
     \  -  start.sh
       \  -  java

问题是,Java程序偶尔会处于一种不遵守“退出”命令的时髦状态,坐在那里欢快地做着事情。 我一直把这个Java进程的进程ID保存到一个PID文件中,并向这些java进程发送-STOP(17?)-TERM(15)和KILL(9)信号,但似乎没有把它们正确地closures。

我可以杀死'start.sh'进程,这会阻止进程树,但会将Java进程置于可怕的死亡(zombie)状态,唯一的解决scheme就是重启服务器。

我想知道是否有人对我如何避免进入这些情况有任何意见,或者是否有任何Linux / shellfunction缺失,可能会阻止这些僵尸进程的发生。 我还应该添加我不能修改Java应用程序代码,因为它是一个专有的应用程序,我没有可用的源代码。

在Fedora 14上运行2.6.35.13-92.fc14.x86_64内核。

提前致谢,

僵尸已经死了 如果你想让他们休息一下,你的父母(main.sh / start.sh)必须wait / waitpid

你有没有看过巫师挥动魔杖的电影之一,身边的每个人都像雕像一样冻结起来,再次挥动它,并继续像以前一样? 这就是要kill -STOP所做的事情,并且没有任何过程可以做到保护自己。

我很惊讶你的java进程成为僵尸,因为僵尸是已经完成的进程,只是在等待,告诉他们的父进程,他们已经完成。 但父母必须检查。 大多数贝壳定期检查。

如果您已经杀死了父进程,那么子进程“改变父进程”,并成为init (PID 1)的子进程。 通常情况下,init始终关注进程,告诉他们已经完成了。

如果你kill -STOP父shell,它将无法响应子进程,通知他们已经完成,所以孩子将成为僵尸,直到你用kill -CONT重启父kill -CONT