linux - 从 shell 中避免僵尸进程?

标签 linux shell unix process zombie-process

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

  1. ma​​in.sh 在屏幕下运行,设置一些变量,然后在前台调用:start.sh(没有&)

  2. start.sh 运行,它设置一些 Java 特定变量,并启动一个 Java 进程(再次在前台 )

  3. 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/

相关文章:

python - linux - 立即启动一个线程

Daemon 可以使用 STDOUT 启动外部进程吗?

linux - 使用 shell 脚本更新 catalina.properties 文件

linux - 使用 printf 通过 grep 显示提取的字符串并用作脚本中的用户输入

c - 加入任何终止的线程

bash - 为什么 echo -n 在 Mac 上的 shell 中不起作用?

c++ - 如何检查我的 Linux Box 安装是否具有 SSE 指令功能?

linux - 使用 awk 排除无法正常工作的文件夹

linux - shell 初始化 : error retrieving current directory: getcwd -- The usual fixes do not wor

windows - Windows/OSX/类 Unix 和二进制文件的 Gnome glib 状态