Ich habe ein Programm, das nützliche Informationen erzeugt, stdoutaber auch ausliest stdin. Ich möchte die Standardausgabe in eine Datei umleiten, ohne die Standardeingabe zu ändern. So weit, so gut: Ich kann:
program > output
und mach nichts in der tty.
Das Problem ist jedoch, dass ich dies im Hintergrund tun möchte. Wenn ich mache:
program > output &
Das Programm wird angehalten ("angehalten (tty input)").
Wenn ich mache:
program < /dev/null > output &
Das Programm wird sofort beendet, da es EOF erreicht.
Es scheint, dass ich in programetwas hineinpfeifen muss, das auf unbestimmte Zeit nichts tut und nicht liest stdin. Die folgenden Ansätze funktionieren:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Dies ist jedoch alles sehr hässlich. Es muss eine elegante Möglichkeit geben, mit Standard-Unix-Dienstprogrammen "nichts auf unbestimmte Zeit zu tun" (um es zu paraphrasieren man true). Wie könnte ich das erreichen? (Meine Hauptkriterien für Eleganz hier: keine temporären Dateien; kein Warten oder periodisches Aufwecken; keine exotischen Hilfsprogramme; so kurz wie möglich.)
su -c 'while true; do true; done | cat > ~/output &' user?
1<&-damit schließen, Ihr Programm beendet wird?
su -c 'program | output &' user. Ich stelle eine ähnliche Frage zum Erstellen von Hintergrundjobs als akzeptable Methode für die Behandlung eines "Service / Daemons". Ich bemerkte auch, dass ich nicht umleiten konnte,STDERRohne auch umzuleitenSTDOUT. Die Lösung in dem Programa sendetSTDOUTzuSTDINder programB, leitet dannSTDERRin eine Protokolldatei:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null