【问题标题】:Start n sub-processes in bash and wait till everything is finished在 bash 中启动 n 个子进程并等待一切完成
【发布时间】:2016-06-06 15:30:48
【问题描述】:

我想测试几个 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

【问题讨论】:

    标签: bash ffmpeg multiple-processes


    【解决方案1】:

    一个非常简单的方法是在后台运行每个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
    

    【讨论】:

    • 确实如此,但有没有一种更独立于迭代项目数的方法?更像是一个简单的“队列”?
    • parallel 处理得很好。在纯 shell 中这样做非常困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多