僵尸进程无需“等待”即可收获

僵尸进程无需“等待”即可收获

我知道如果子进程没有得到正确的收获,它就会变成僵尸,你可以通过ps命令看到它。

此外,“wait [pid]”命令将等待在后台运行的子 shell,直到它完成并获取它。

我有一个这样的脚本:

#!/bin/bash
sleep 5 &

tail -f /dev/null

我的问题是,我不使用waitaftersleep 5 &并且父 shell 永远不会因为 而终止tail,那么为什么sleep 5 &不会成为僵尸?我看到它完成后就消失了ps,不知道谁收割了它?

答案1

这是使用 shell 模仿操作系统 API 的陷阱之一。它确实会造成混乱。在这种情况下你会感到困惑等待()(Linux API)与等待(bash 函数)。

很简单,Bash 会为您处理收获过程,您通常不需要考虑这一点。 bash命令wait对收割进程没有影响。

当您的子作业终止时,bash 将通过SIGCHLD信号。当这种情况发生时,bash 将停止它正在做的任何事情并收获停止的孩子。然后它会回到它正在做的事情。

答案2

您对“”的使用&要求父进程将“ sleep 5”放在后台,因此父进程将收获sleep 5.

相关内容