2017-11-04 1 views
1

Ich habe ein sh Skript, das ffmpeg auf mehrere Dateien aufruft. Wenn ich versuche, dieses Skript im Hintergrund laufen zu lassen, Ausgabe in eine Datei umleiten, beginnt der Job, aber dann unterbricht sofort:Wenn ich `ffmpeg` im Hintergrund starte, wie verhindere ich` suspended (tty output) `?

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

Wenn ich versuche, das Skript im Hintergrund weiter zu machen, setzt es sofort wieder:

% 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 &> 
% 

Ich kann das Skript weitermachen, indem ich es zum Vordergrund mache, aber dann ist mein Terminal besetzt, bis das Skript beendet ist. Das bedeutet, dass ich nicht den Vorteil habe, das Skript im Hintergrund auszuführen.

Wie kann ich das Skript sauber im Hintergrund laufen lassen?

Eine vereinfachte Version von meinem Skript ist:

#!/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 

ich auf Mac OS X 10.11.6 leite, mit ffmpeg version 3.4 von MacPorts geliefert.

Eine scheinbar verwandte Frage ist why do I get “Suspended (tty output)” in one terminal but not in others?. Die Antwort dort ist, den Terminal-Zustand mit stty -tostop zu setzen. Das hat mir nicht geholfen; Ich hatte diesen Zustand bereits eingestellt.

+0

Nun, da ich den Knopf gedrückt Frage habe, kommt mir der Gedanke, dass diese Frage mehr angemessen passen könnte in [ Super User] (https://superuser.com/questions/tagged/ffmpeg). –

Antwort

2

ffmpeg ermöglicht die Interaktion mit stdin standardmäßig. (Siehe documentation on its -stdin option.) Auf Mac OS X- und Linux-Systemen führt dies dazu, dass ein ffmpeg-Job im Hintergrund angehalten wird, obwohl er seltsamerweise mit einer Meldung über "tty output" statt "tty input" verbunden ist.

Option Hinzufügen -nostdin zum Aufruf verursacht ffmpeg nicht stdin Interaktion zu ermöglichen, und so vermeidet den Hintergrundprozess auszusetzen.

Also, wenn ich von meinem Aufruf geändert:

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

zu:

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

dann das Skript lief ohne Aussetzung.

Sie können einen ähnlichen Effekt erzielen, indem Sie die Eingabe an /dev/null umleiten. Dies kann unter dem Aufruf ffmpeg oder beim Aufruf des Shell-Skripts erfolgen, in dem Sie den Lauf an den Hintergrund senden. Das Schöne daran ist, dass Sie ffmpeg für stdin brauchen, ohne das Skript zu ändern, das ffmpeg aufruft. Der Nachteil ist, dass es unter Windows anders funktioniert als unter Linux und Mac OS X.

Sie würden das Skript Aufruf ändern von:

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

zu:

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

Diese [Antwort auf SuperUser] (https://superuser.com/a/577055/114802) gibt die gleichen Optionen, '-nostdin' und'

Verwandte Themen