linux 并行化函数的最后一个示例的状态

tcomlyy6  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(120)

我正在寻找一种方法来并行运行一个函数,并确切地知道所有函数示例何时完成。我添加了一个微调器(函数的示例运行不同的时间,取决于变量,所以我需要在屏幕上看到一些东西),并尝试了以下方法:

for a in "${ARRAY[@]}"; do
    spin='/-\|'
    while true; do
        i=$(( (i+1) %4 )); printf "\r[ ${spin:$i:1} ] "; sleep .3;
    done & someFunction & 
    kill $!; trap 'kill $!' SIGTERM
done

字符串
但是someFunction不工作。我认为这是因为如果它作为someFunction &被触发,它会立即被下一行代码杀死。而且在脚本结束后,微调器会在CLI上永远工作。
什么是同时运行someFunction的方法,直到最后一个instace完成,并保留微调器直到那时?

kyks70gy

kyks70gy1#

您需要跟踪已分叉的进程,然后为它们使用wait。(而不是一个接一个)或仅用于特定作业。参见man bash,下面的脚本启动一个微调器,每秒打印一些东西,然后派生出5个进程,这些进程休眠不同的时间。

spinner() { for ((;;)); do sleep 1; printf '<spin>'; done; }
someFunction() { sleep "$1"; }

spinner &
spinner_pid="$!"
for ((i = 2; i < 12; i += 2)); do
  someFunction "$i"&
  function_pids["$!"]="$i"
done

while ((${#function_pids[@]})); do
  wait -n -p pid && echo -n  'finished: ' || echo -n 'failed: '
  echo "${function_pids[pid]}"
  unset 'function_pids[pid]'
done
kill -TERM "$spinner_pid"
wait -n "$spinner_pid" || :

字符串

相关问题