Ich habe ein Programm, das nützliche Informationen erzeugt, stdout
aber 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 program
etwas 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,STDERR
ohne auch umzuleitenSTDOUT
. Die Lösung in dem Programa sendetSTDOUT
zuSTDIN
der programB, leitet dannSTDERR
in eine Protokolldatei:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null