我有一个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
设置终端状态。那对我没有帮助;我已经有了这个状态。
答案 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 &