当我在后台运行`ffmpeg`时,如何防止`suspended(tty output)`?

时间:2017-11-04 20:14:11

标签: ffmpeg multiprocessing sh

我有一个sh脚本,可以在几个文件上调用ffmpeg。当我尝试在后台运行此脚本时,将输出重定向到文件,作业开始但随后立即暂停:

% bin/mp3convert.sh path/a/b &> ~/tmp/log.txt &
[1] 93352
% 
[1]  + suspended (tty output)  bin/mp3convert.sh path/a/b &> 

如果我尝试让脚本在后台继续,它会立即再次暂停:

% jobs
[1]  + suspended (tty output)  bin/mp3convert.sh path/a/b &> 
% bg %1
[1]  + continued  bin/mp3convert.sh path/a/b &> 
% jobs
[1]  + suspended (tty output)  bin/mp3convert.sh path/a/b &> 
%

我可以通过使脚本成为前台来使脚本继续,但是然后我的终端被占用直到脚本完成。这意味着我无法在后台运行脚本。

% 
[1]  + suspended (tty output)  bin/mp3convert.sh path/a/b &> 
% fg %1
[1]  + continued  bin/mp3convert.sh path/a/b &> 
% # much time passes with no activity on terminal, then script finishes
%

如何让脚本在后台干净利落地运行?

我的脚本的简化版本是:

#!/bin/sh
# mp3convert.sh
for f in "$1"/*.flac; do
    ffmpeg -i "$f" -c:v copy path/to/dest/"$(basename -s .flac "$f")".mp3
done

我在Mac OS X 10.11.6上运行,ffmpeg version 3.4提供MacPorts

一个明显相关的问题是why do I get “Suspended (tty output)” in one terminal but not in others?。答案是用stty -tostop设置终端状态。那对我没有帮助;我已经有了这个状态。

1 个答案:

答案 0 :(得分:2)

ffmpeg默认启用与 stdin 的互动。 (参见documentation on its -stdin option。)在Mac OS X和Linux系统上,这会导致在后台运行的ffmpeg作业暂停,但奇怪的是有关于“tty output”而不是“tty input”的消息。

向调用添加选项-nostdin会导致ffmpeg无法启用 stdin 交互,因此可以避免暂停后台进程。

所以,当我改变我的调用时:

    ffmpeg -i "$f" -c:v copy path/to/dest/"$(basename -s .flac "$f")".mp3

为:

    ffmpeg -nostdin -i "$f" -c:v copy path/to/dest/"$(basename -s .flac "$f")".mp3

然后脚本在没有暂停的情况下运行。

您可以通过将输入重定向到/dev/null来获得类似的效果。这可以在ffmpeg调用或调用shell脚本时完成,在脚本脚本中将运行发送到后台。关于这一点的好处是,您可以解决ffmpeg stdin 的需求,而无需修改调用ffmpeg的脚本。这样做的缺点是它在Windows上的工作方式与在Linux和Mac OS X上的工作方式不同。

您可以从以下位置更改脚本调用:

% bin/mp3convert.sh path/a/b &> ~/tmp/log.txt &

为:

% bin/mp3convert.sh path/a/b < /dev/null &> ~/tmp/log.txt &