GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Simulieren Sie eine leere Standardeinstellung für einen getrennten Befehl?

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).

Verwandte:Wie bekomme ich eine automatische Vervollständigung im Bash-Stil in zsh (für den Befehl git)?
Linux
  1. Wie kann /dev/random oder /dev/urandom mit base64 codiert werden?

  2. screen Ihr Terminal '/dev/pts/0' kann nicht geöffnet werden - bitte überprüfen

  3. Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

  4. DD von /dev/zero nach /dev/null ... was eigentlich passiert

  5. die Verwendung von < /dev/null &in der Kommandozeile

Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0?

Wann sollte /dev/random vs. /dev/urandom verwendet werden?

/dev/null unter Linux

Kernel:/dev/kmem und /dev/mem deaktivieren

Erstellen Sie ein virtuelles Blockgerät, das in /dev/null schreibt

Gibt es unter Linux ein Verzeichnisäquivalent zu /dev/null?