Wie kann man auf elegante Weise ewig nichts tun?

Wie kann man auf elegante Weise ewig nichts tun?

Ich habe ein Programm, das nützliche Informationen über erzeugt, stdoutaber auch von liest stdin. Ich möchte seine Standardausgabe in eine Datei umleiten, ohne etwas auf der Standardeingabe bereitzustellen. So weit, so gut: Ich kann Folgendes tun:

program > output

und tun Sie nichts im TTY.

Das Problem ist jedoch, dass ich dies im Hintergrund tun möchte. Wenn ich das tue:

program > output &

das Programm wird angehalten („suspendiert (tty-Eingabe)“).

Wenn ich mache:

program < /dev/null > output &

Das Programm wird sofort beendet, da es EOF erreicht.

Es scheint, dass ich eine Pipe in etwas brauche program, das für eine 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 &

Das ist jedoch alles sehr hässlich.hateine elegante Möglichkeit zu sein, mit Standard-Unix-Dienstprogrammen „auf unbestimmte Zeit nichts zu tun“ (um es anders auszudrücken man true). Wie könnte ich das erreichen? (Meine Hauptkriterien für Eleganz hier: keine temporären Dateien; kein Busy-Waiting oder periodisches Aufwachen; keine exotischen Dienstprogramme; so kurz wie möglich.)

Antwort1

Ich glaube nicht, dass es etwas Eleganteres geben wird als das

tail -f /dev/null

das Sie bereits vorgeschlagen haben (vorausgesetzt, dies verwendet intern inotify, sollte es keine Abfragen oder Wakeups geben, also sollte es, abgesehen davon, dass es seltsam aussieht, ausreichend sein).

Sie benötigen ein Dienstprogramm, das unbegrenzt ausgeführt wird, seinen Standardausgang offen hält, aber nichts in den Standardausgang schreibt und nicht beendet wird, wenn sein Standardeingang geschlossen wird. Etwas wie yesschreibt tatsächlich in den Standardausgang. catwird beendet, wenn sein Standardeingang geschlossen wird (oder was auch immer Sie umleiten, ist erledigt). Ich denke, sleep 1000000000ddas könnte funktionieren, aber das tailist eindeutig besser. Meine Debian-Box hat ein, tailfdas den Befehl etwas verkürzt.

Wie wäre es, wenn Sie es mit einem anderen Ansatz versuchen und das Programm unter ausführen screen?

Antwort2

sleep infinityist die klarste Lösung, die ich kenne.

Sie können verwenden infinity, weil sleepeine Gleitkommazahl akzeptiert*, die sein kannDezimal,hexadezimal,Unendlichkeit, oderNaN, entsprechend man strtod.

* Dies ist nicht Teil des POSIX-Standards und daher nicht so portierbar wie tail -f /dev/null. Es wird jedoch in GNU coreutils (Linux) und BSD (auf dem Mac verwendet) unterstützt (offenbar nicht auf neueren Mac-Versionen unterstützt – siehe Kommentare).

Antwort3

sleep 2147483647 | program > output &

Ja, 2^31-1ist eine endliche Zahl, und sie wird nicht ausgeführtfür immer, aber ich gebe Ihnen 1000 $, wenn der Ruhezustand endlich abläuft. (Hinweis: Bis dahin wird einer von uns tot sein.)

  • keine temporären Dateien; überprüft.
  • kein Busy-Waiting oder regelmäßiges Aufwachen; überprüfen Sie
  • keine exotischen Dienstprogramme; check.
  • so kurz wie möglich. Okay, es könnte kürzer sein.

Antwort4

Sie können eine Binärdatei erstellen, die genau das tut, mit:

$ echo 'main(){pause();}'| gcc -Wno-all -xc - -o pause

Ich finde dies elegant, da der pauseSystemaufruf buchstäblich der einzige Systemaufruf ist, dessen einziger Zweck darin besteht, für immer nichts zu tun (oder bis ein Signal den Prozess beendet), ohne dass er in einer Warteschleife sitzt, dies als Nebeneffekt von etwas anderem ausgeführt wird oder ohne es dem übergeordneten Prozess mitzuteilen (übergeordnete Prozesse können elegant und ohne zu blockieren waitpiddarauf warten, dass ihre untergeordneten Prozesse durch ein Signal gestoppt werden, und viele (vor allem Shells) tun dies auch, während es bei einem Systemaufruf ohne Signalauslösung um einiges schwieriger ist, darauf zu warten, dass ein untergeordneter Prozess blockiert wird).

verwandte Informationen