Ich möchte den Befehl entweder mit „Befehl &“ am Ende oder mit „nohup-Befehl &“ trennen, aber es stoppt direkt nach dem Trennen.
Der Befehl ist wenig spezifisch, wenn er bei der Eingabe eof erhält, bricht er ab, so dass /dev/null als Eingabe zum Ende und zur Lösung führt, die normalerweise funktioniert:
$ command < /dev/null > /dev/null 2>&1 &
funktioniert nicht...
Gibt es ein anderes Gerät in Unix/Linux, das /dev/null ersetzen kann und sich wie eine leere Eingabe verhält, aber kein eof sendet.
(Übrigens ist Befehl ein sehr nützliches Multicasting-Tool Emcast, ich kann versuchen, es selbst zu patchen, oder eine gepatchte Version für diesen Zweck finden … aber es scheint, dass das Problem außerhalb gelöst werden kann)
Ich füge diese BEARBEITUNG hinzu, um meine Frage klarer zu machen. Ich habe dieses C-Programm aus 2 Zeilen erstellt, das perfekt funktioniert:Programmname ist „donothing“
#include <unistd.h>
int main() { while (1) { sleep(10); } return 0; }
und es ist das, wonach ich suche, ein Gerät / Programm, das nichts tut, aber seine Standardausgabe offen lässt. Beide („command &… disown“ und „nohup command &“) funktionieren.
$ donothing | mycommand >/dev/null &
$ disown %1
funktioniert gut, also ist jetzt nur noch die Frage:Welches Unix-Gerät/-Programm verhält sich wie mein „Nichtstun“.
Akzeptierte Antwort:
Damit Ihr Befehl eof
erkennt , es muss von stdin gelesen werden. Vermutlich erwartet es also einige Eingaben. Es hört sich also so an, als ob Sie keine leere Eingabe benötigen (/dev/null
ist genau dafür gedacht), aber Input, der nie kommt.
Es kann mit einer Pipe simuliert werden, bei der niemand am anderen Ende schreiben wird wie:
sleep 999999999 | the-command
Oder um diesen zusätzlichen sleep
zu vermeiden Befehl, könnte dies mit einer Named Pipe erfolgen:
fifo=$(mktemp -u) &&
mkfifo "$fifo" &&
(rm "$fifo" && the-command <&3 3<&- &) 3<> "$fifo"
Hier wird ein zwischengeschalteter Dateideskriptor verwendet, um die Tatsache zu umgehen, dass die Shell stdin mit /dev/null
verbindet implizit, wenn Sie einen Befehl mit &
starten (es sei denn, Sie fügen eine explizite stdin-Umleitung wie unsere <&3
hinzu hier).
Unter Linux (und wahrscheinlich nur unter Linux) können Sie auch Folgendes tun:
the-command < /dev/fd/1 3>&1 > /dev/null | :
/dev/fd/1
wobei fd 1 mit einer Pipe verbunden ist, verhält sich unter Linux wie eine benannte Pipe. Das heißt, wenn Sie es im Lesemodus öffnen, erhalten Sie das Leseende der Pipe.
Oben wird also fd 0 mit dem lesenden Ende einer Pipe verbunden, deren anderes Ende sich auf dem fd 3 von the-command
befindet . Weil the-command
wird nichts auf seine fd 3 schreiben, irgendeinen read
Versuch auf fd 0 wird blockiert (oder ein nicht blockierender Lesevorgang wird zurückgegeben mit es gibt noch nichts zu lesen , oder eine Auswahl/Abfrage gibt nichts zu lesen zurück entweder als the-command
wahrscheinlich tut, wenn es etwas anderes tut, als auf eine Eingabe zu warten, die nie kommt).