【问题标题】:When I run `ffmpeg` in the background, how do I prevent `suspended (tty output)`?当我在后台运行`ffmpeg`时,如何防止`suspended (tty output)`?
【发布时间】:2017-11-04 20:14:11
【问题描述】:

我有一个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.4MacPorts 提供。

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

【问题讨论】:

  • 现在我已经按下了询问按钮,我突然想到这个问题可能更适合Super User

标签: ffmpeg multiprocessing sh


【解决方案1】:

ffmpeg 默认启用与 stdin 的交互。 (参见documentation on its -stdin option。)在Mac OS X 和Linux 系统上,这会导致在后台运行的ffmpeg 作业挂起,尽管奇怪的是带有关于“tty 输出”而不是“tty 输入”的消息。

在调用中添加选项 -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 脚本时完成。这样做的好处是您可以解决ffmpegstdin 的需求,而无需修改调用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 & 

【讨论】:

  • 这个answer on SuperUser 提供了相同的选项,-nostdin&lt;/dev/null,但问题略有不同,我可以并行运行多少个 FFmpeg 命令实例?.
  • 请注意,这些解决方案都不再适用于 MacOS,至少从 10.14.6 开始。我还没有找到在该系统上以非交互方式运行 ffmpeg 的解决方案。
  • @JohnSmith 有趣。考虑对这个问题提出一个变体,但指定 macOS 10.14.6,并显示您使用的命令行以及您观察到的症状。我自己没有 10.14,但我最终会的。我也想要这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 2011-04-14
  • 1970-01-01
相关资源
最近更新 更多