在bash开始n个子流程,等待一切完成
Start n sub-processes in bash and wait till everything is finished
我想测试几个 ffmpeg 设置和 运行 多个命令 'sub-processes'。不过,我不想一次启动超过 4 个进程。这样做的好方法是什么?也许是在 运行 在 bg 中设置进程之前捕获进程 ID,然后等待它们不再出现在进程列表中?或 xargs?
这是没有 'queuing' 的脚本:
#!/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
我想测试几个 ffmpeg 设置和 运行 多个命令 'sub-processes'。不过,我不想一次启动超过 4 个进程。这样做的好方法是什么?也许是在 运行 在 bg 中设置进程之前捕获进程 ID,然后等待它们不再出现在进程列表中?或 xargs?
这是没有 'queuing' 的脚本:
#!/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