gpt4 book ai didi

bash - 在 bash 中使用 trap 捕获已终止后台进程的 pid

转载 作者:行者123 更新时间:2023-11-29 09:05:57 24 4
gpt4 key购买 nike

我正在编写一个生成多个后台进程的 bash 脚本。我希望在进程终止时得到通知;我想知道终止进程的 pid。

我研究过使用 wait,这样每个派生进程的 pids 都被捕获并存储在一个数组中,然后迭代该数组,并在每个进程上调用 wait。此处以各种方式描述了此技术:

https://stackoverflow.com/a/356154/366856

这个问题,如果我理解正确的话,如果你想在一个单独的进程终止后立即执行一些操作,它的效率可能相对较低。例如,如果您生成进程 A 和 B,并且 B 在 A 之前完成,那么执行必须等待 A 和 B 都完成。我需要在 B 完成后立即执行操作。

似乎 trap SIGCHLD 是在 child 终止时立即执行操作的方法,但问题是我找不到确定 SIGCHLD 信号源的 pid 的方法,我也需要。我发现最接近此工作示例的是本文中的第三个代码示例:

http://www.linuxforums.org/forum/programming-scripting/103996-multithreading-bash.html#post510187

为了方便,我把它复制粘贴在这里:

#!/bin/bash

iNext=0

function ChildReturned() {
wait $1
echo "$1 was returned. Its exits status was: $?"
iNext=$((iNext+1))
StartChild $iNext
}


function StartChild {
./child $1 &
pid=$!
echo "Started: $1 PID= $pid"
trap 'ChildReturned $pid' SIGCHLD
}


set -bm

for (( iNext=0; iNext<=10; iNext++ ));
do
StartChild $iNext
done

wait

我认为这个例子行不通,因为作者犯了多次调用trap的错误,每次在trap的参数中捕获不同的pid变量.每次调用 trap 时,它都会覆盖之前的调用,因此将捕获任意 pid。我找不到更好的技术。

有没有办法在 bash 中使用 trap 获取已终止子进程的 pid?

更新

我只是想指出这个资源,它包含迄今为止我所见过的解决这个问题的最好、最全面的概述:

http://mywiki.wooledge.org/ProcessManagement#I_want_to_process_a_bunch_of_files_in_parallel.2C_and_when_one_finishes.2C_I_want_to_start_the_next._And_I_want_to_make_sure_there_are_exactly_5_jobs_running_at_a_time .

最佳答案

设置一次陷阱,在陷阱中你可以调用jobs -n 来查看自上次检查以来哪些 child 已经完成。请注意,这不会告诉您哪个 child 发送了 SIGCHLD;考虑两个 child 在你进入陷阱之前死亡的情况。在那种情况下,你只会进入陷阱一次,而且你实际回应的是哪个子进程的信号是有争议的。请注意,-n 是 bash 扩展,您可能更喜欢使用 jobs -l

关于bash - 在 bash 中使用 trap 捕获已终止后台进程的 pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9536388/

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