我正在编写几个 shell 脚本来做一些事情:
main.sh 在屏幕下运行,设置一些变量,然后在前台调用:start.sh(没有&)
start.sh 运行,它设置一些 Java 特定变量,并启动一个 Java 进程(再次在前台 )
Java 运行并执行其操作,直到收到“退出”命令。 (也在前景
所以我的进程树看起来像:
- main.sh \- start.sh \- java
问题是 Java 程序偶尔会进入一种奇怪的状态,它不遵守您的“退出”命令,而是坐在那里愉快地做它的事情。我一直在将这个 Java 进程的进程 ID 保存到一个 PID 文件,并向这些 Java 进程发送 -STOP(17?) -TERM(15) 和 KILL(9) 信号,但似乎没有什么可以正确地杀死它们。
我可以 kill -9 'start.sh' 进程,它确实会杀死进程树,但会使 Java 进程处于可怕的已失效(僵尸)状态,唯一的解决方案是重新启动服务器。
我想知道是否有人对我如何避免陷入这些情况有任何意见,或者我是否缺少任何可能阻止这些僵尸进程发生的 Linux/shell 功能。我还应该补充一点,我不能修改 Java 应用程序代码,因为它是专有应用程序,而且我没有可用的源代码。
这在 Fedora 14 上运行,内核为 2.6.35.13-92.fc14.x86_64。
提前致谢
最佳答案
僵尸已经死了。如果你想让它们在原地休息,你的 parent (main.sh/start.sh)必须wait
/waitpid
吧。
关于linux - 从 shell 中避免僵尸进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605837/