gpt4 book ai didi

bash - 在 bash 中启动 n 个子进程并等待一切完成

转载 作者:行者123 更新时间:2023-12-04 22:55:54 26 4
gpt4 key购买 nike

我想测试几个 ffmpeg 设置并将多个命令作为“子进程”运行。不过,我不想一次启动超过 4 个进程。有什么好方法可以做到这一点?也许像在 bg 中运行进程之前捕获进程 ID 并等到它们不再在进程列表中?还是 xargs?

这是没有“排队”的脚本:

#!/bin/bash

for crf in 10 15 20 23 25 30 35 ; do
for vid_preset in medium slow veryslow; do
ffmpeg -r 25 -i pics/pic_%04d.png -vcodec libx264 -crf $crf -vpre $vid_preset anim_crf$crf\_$vid_preset.mp4
done
done

最佳答案

一个非常简单的方法是只运行每个 ffmpeg在后台处理,然后等待它们完成,然后继续下一个值 crf .

for crf in 10 15 20 23 25 30 35 ; do
for vid_preset in medium slow veryslow; do
ffmpeg -r 25 -i pics/pic_%04d.png -vcodec libx264 \
-crf $crf -vpre $vid_preset anim_crf${crf}_${vid_preset}.mp4 &
done
wait
done

如果您有 parallel安装后,您可以使用它以繁忙的方式运行所有 21 个进程。
# Run 4 jobs at a time, starting a new job whenever one completes.
parallel -j 4 ffmpeg -r 25 -i pics/pic_%04d.png \
-vcode libx264 -crf {1} -vpre {2} \
anim_crf{1}_{2}.mp4 ::: 10 15 20 23 25 30 35 ::: medium slow veryslow
{1}被第一个输入源的选择替换(在第一个 ::: 之后), {2}通过选择形式的第二个输入源。一个例子更简单地解释它:
$ parallel echo {1} {2} ::: a b c :: 1 2
a 2
a 1
b 1
b 2
c 1
c 2
bash 中的一种困惑方法4.3 或更高版本(引入 wait -n 时):
max_jobs=4
running=()
for c in 10 15 20 23 25 30 35; do
for v in medium slow veryslow; do
ffmpg ... &
running+=($!)
# If we're at capacity, wait for a job to complete
if (( ${#running[@]} == $max_jobs )); then
wait -n
# Any where from 0 to max_jobs - 1 could still be running
running=( $(jobs -p) )
fi
done
done

关于bash - 在 bash 中启动 n 个子进程并等待一切完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37661315/

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