【发布时间】:2017-03-14 13:58:23
【问题描述】:
是否可以阻止 PID 被重复使用?
例如,如果我在后台使用myjob & 运行作业myjob,并使用PID=$! 获取PID,是否可以阻止Linux 系统重新使用该PID,直到我检查了PID 不再存在(进程已结束)?
换句话说,我想做这样的事情:
myjob &
PID=$!
do_not_use_this_pid $PID
wait $PID
allow_use_of_this_pid $PID
想要这样做的原因在上面给出的示例中没有多大意义,但可以考虑连续启动多个后台作业,然后等待它们全部完成。
一些程序员老兄正确地指出,没有两个进程可以共享相同的 PID。这是正确的,但不是我在这里问的。我要求一种防止在使用特定 PID 启动进程后重新使用 PID 的方法。然后还有一种方法可以在我用完之后重新启用它,以检查我的原始过程是否完成。
既然被要求了,这里有一个用例:
- 启动多个后台作业
- 获取后台作业的 PID
- 防止 PID 在后台作业终止后被另一个进程重新使用
- 检查“后台作业”的 PID - 即确保后台作业完成
- [请注意,如果为后台作业的 PID 禁用 PID 重用,则这些 PID 不能被在后台进程终止后启动的新进程使用]*
- 重新启用后台作业的 PID
- 重复
*进一步说明:
- 假设启动了 10 个工作
- 作业 5 退出
- 另一个用户启动的新进程,例如,他们登录到一个 tty
- 新进程的 PID 与 Job 5 相同!
- 现在我们的脚本检查 Job 5 是否终止,但看到 PID 正在被 tty 使用!
【问题讨论】:
-
内核已经不允许它了。没有两个进程可以有相同的 pid。
-
@Someprogrammerdude 好的,我解释得不够清楚,我会编辑我的问题,一秒钟
-
也许您可以添加用例?告诉我们您要解决什么问题?关于the XY problem的相关阅读
-
如果可以,我会写一个炸弹:
for x in $(seq 1 PID_MAX); do do_not_use_this_pid $x; done -
您可能可以使用
trap ... SIGCHLD来异步处理子PID 终止。这样,您就不必担心 PID 在终止后以及在检查其状态之前会被重用。你只需要真正在你的脚本中小心启动子进程。