我正在写几个shell脚本来做一些事情:
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
。