gpt4 book ai didi

linux - Bash `wait` 命令,等待超过 1 个 PID 完成执行

转载 作者:IT王子 更新时间:2023-10-29 00:38:31 32 4
gpt4 key购买 nike

我最近发布了一个问题,询问是否有可能 prevent PID's from being re-used .

到目前为止,答案似乎是否定的。 (这很好。)

但是,用户Diego Torres Milano添加了该问题的答案,我的问题是关于该答案的。

迭戈回答,

If you are afraid of reusing PID's, which won't happen if you wait as other answers explain, you can use

echo 4194303 > /proc/sys/kernel/pid_max

to decrease your fear ;-)

我实际上不明白为什么迭戈在这里使用数字 4194303,但这是另一个问题。

我的理解是我遇到了以下代码的问题:

for pid in "${PIDS[@]}"
do
wait $pid
done

问题是我在一个数组中有多个 PID,并且 for 循环将对数组中的每个 PID 按顺序运行 wait 命令,但是我无法预测进程将在它们的 PID 存储在此数组中的顺序相同。

即;以下可能发生:

  • 开始等待数组索引 0 中的 PID
  • PID 在数组索引 1 中的进程终止
  • 新作业在系统上运行,导致存储在 PID 数组索引 1 中的 PID 被重新用于另一个进程
  • wait 在数组索引 0 中的 PID 退出时终止
  • 开始等待数组索引 0 中的 PID,除了现在这是一个不同的进程,我们不知道它是什么
  • 运行的进程重新使用了 wait 当前正在等待的 PID never 终止。可能是邮件服务器的 PID 或系统管理员启动的东西。
  • wait 一直等待,直到发现下一个严重的 linux 错误并重新启动系统或断电

迭戈说:

which won't happen if you wait as other answers explain

即;我上面描述的情况不可能发生。

迭戈是否正确?

  • 如果是,为什么不会出现我上面描述的情况?

或者 Diego 不正确?

  • 如果是这样,那么我今天晚些时候发布一个新问题...

附加说明

我突然想到这个问题可能令人困惑,除非您知道 PID 是在后台启动的进程的 PID。即;

my_function &
PID="$!"
PIDS+=($PID)

最佳答案

让我们来看看您的选择。

无条件等待所有后台作业

for i in 1 2 3 4 5; do
cmd &
done
wait

这样做的好处是简单,但您不能让您的机器忙碌。如果你想在旧工作完成后开始新工作,你不能。在所有后台作业完成之前,您的机器的利用率越来越低,此时您可以开始新的一批作业。

相关的是通过将多个参数传递给 wait 来等待作业子集的能力:

unrelated_job &
for i in 1 2 3 4 5; do
cmd & pids+=($!)
done
wait "${pids[@]}" # Does not wait for unrelated_job, though

以任意顺序等待单个作业

for i in 1 2 3 4 5; do
cmd & pids+=($!)
done

for pid in "${pids[@]}"; do
wait "$pid"
# do something when a job completes
done

这样做的好处是让您可以在工作完成后继续工作,但是仍然存在这样的问题,即 other $pid 作业可能首先完成,导致您的机器未得到充分利用,直到 $pid 实际完成。但是,您仍然可以获得每个作业的退出状态,即使它在您实际等待之前完成。

等待下一个作业完成(bash 4.3 或更高版本)

for i in 1 2 3 4 5; do
cmd & pids+=($!)
done

for pid in "${pids[@]}"; do
wait -n
# do something when a job completes
done

在这里,您可以等到一个 作业完成,这意味着您可以让您的机器尽可能忙碌。唯一的问题是,如果不使用 jobs 获取事件进程列表并将其与 pids 进行比较,您不一定知道哪个 作业已完成>.

其他选择?

shell 本身并不是进行作业分配的理想平台,这就是为什么有大量程序设计用于管理批处理作业的原因:xargsparallelslurmqsub

关于linux - Bash `wait` 命令,等待超过 1 个 PID 完成执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40377623/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com