Bash:是否可以阻止PID被重用?

时间:2016-11-01 12:16:24

标签: linux bash pid

是否可以停止重复使用PID?

例如,如果我在后台使用myjob运行作业myjob &,并使用PID=$!获取PID,是否可以阻止linux系统重新使用该PID直到我检查PID不再存在(过程已经完成)?

换句话说,我想做的事情如下:

myjob &
PID=$!
do_not_use_this_pid $PID
wait $PID
allow_use_of_this_pid $PID

想要这样做的原因在上面给出的示例中没有多大意义,但考虑在系列中启动多个后台作业,然后等待它们全部完成。

一些程序员老兄正确地指出,没有2个进程可以共享相同的PID。这是正确的,但不是我在这里要求的。我要求一种方法,以防止在使用特定PID启动进程后重新使用PID。然后还有一种方法,在我完成使用它来检查我的原始过程是否完成之后再重新启用它。

由于有人要求,这是一个用例:

  • 启动多个后台工作
  • 获得后台工作的PID
  • 在后台作业终止后,防止PID被其他进程重用
  • 检查"后台工作的PID" - 即确保完成后台工作
  • [请注意,如果禁用PID重新使用后台作业的PID,则后台进程终止后启动的新进程无法使用这些PID] *
  • 重新启用后台作业的PID
  • 重复

*进一步说明:

  • 假设启动了10个工作
  • Job 5退出
  • 新流程由其他用户启动,例如,他们登录到tty
  • 新进程与作业5具有相同的PID!
  • 现在我们的脚本检查作业5终止,但看到tty使用了PID!

4 个答案:

答案 0 :(得分:7)

您不能“阻止”PID被内核重用。但是,我倾向于认为这不是一个真正的问题。

  

但请考虑连续启动多个后台作业,然后等待它们全部完成。

简单的wait(不带参数)会等待所有子进程完成。所以,你不需要担心 PID被重用。

当您启动多个后台进程时,其他进程可能会重用PID。 但这不是问题,因为除非是您的子进程,否则您不能wait进程。

否则,检查您启动的其中一个后台作业是否以wait以外的任何方式完成,总是不可靠。

答案 1 :(得分:1)

除非您检索到子进程的返回值,否则它将存在于内核中。这也意味着它的pid与它绑定,并且在此期间无法重复使用。

答案 2 :(得分:0)

进一步建议解决此问题 - 如果您怀疑分配给某个后台作业的PID已重新分配,请在ps中进行检查,看看它是否仍然是您的进程您的可执行文件并具有PPID(父PID)1。

答案 3 :(得分:0)

如果您害怕重复使用PID,如果您wait其他答案解释不会发生,您可以使用

echo 4194303 > /proc/sys/kernel/pid_max

减少你的恐惧; - )