Ich habe einen Ausschnitt von Bash in den Hintergrund eines aus der Ferne ausgeführten ssh-Befehls kopiert:
ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
Was macht <&-
das?
Ich vermute, es ist dasselbe wie< /dev/null
Mein nächstes Verständnis ist , dass die drei wichtigsten Datei - Deskriptoren ( stdin
, stdout
, stderr
) müssen geschlossen werden , um zu verhindern:
- Der Hintergrund des Jobs und das Beenden des Drehbuchs - irgendwie widersprüchlich?
- Wenn das Terminal geschlossen wird, werden alle Prozesse, die stdin vom Terminal akzeptieren, geschlossen?
bash
shell
io-redirection
Eric Francis
quelle
quelle
ssh -nNT user@remote 'command'
wird eine nicht interaktive SSH-Sitzung erstellt. Hänge es&
an den Hintergrund an, bevor du esnohup
an das anfügst ,command
um es am Laufen zu halten, wenn deine Verbindung unterbrochen wird.man ssh
schlägt vor, dass -N die Ausführung eines Remotebefehls vollständig deaktiviert, und ein schneller Test unterstützt dies.Antworten:
<&-
ist nicht ganz dasselbe wie< /dev/null
.<&-
Schließt fd 0, während< /dev/null
es vom Gerät umgeleitet wird/dev/null
, das niemals Daten liefert und beim Lesen immer EOF gibt. Der Unterschied besteht hauptsächlich darin, dass einread(2)
Aufruf von einer geschlossenen FD (der<&-
Fall) mit EBADF einen Fehler verursacht, wohingegen ein Aufruf von einer nullumgeleiteten FD keine gelesenen Bytes zurückgibt (Dateiende-Bedingung). Wenn Ihr Programm nie von stdin liest, spielt die Unterscheidung keine Rolle.Das Schließen der FDs ist empfehlenswert, wenn Sie einen Hintergrund erstellen, da ein Hintergrundprozess hängen bleibt, wenn er versucht, etwas von TTY zu lesen. Dieses Beispiel behandelt jedoch nicht alles, was es sollte. idealerweise gäbe es irgendwo einen
nohup
odersetsid
Aufruf, um den Hintergrundprozess vollständig zu trennen.quelle
nohup
zusätzlich zum Schließen Dateideskriptoren verwenden?setsid some process <&- >path/to/log 2>path/to/error
. Die schnellere Methode ist so etwas wienohup some process &
.nohup
macht hier keinen Sinn.nohup
Verhindern, dass der Prozess einHUP
Signal empfängt , wenn sein Steuerterminal geschlossen ist. Aber Sie hatten in diesem Fall kein Terminal.Siehe
man bash
:quelle
[n]<&word
Wort mehr als eine Ziffer enthält.man bash
falschbash
entscheidet sich dafür, es auf eine vernünftige Art und Weise zu implementieren (für eine geeignete Definition von "vernünftig"). Andere Muscheln können dies tun oder nicht.bash
, nichtposix-shell
.<&-
Standardeingabe schließen.Die von POSIX definierte allgemeine Form lautet:
Der Zweck des Dateideskriptors
n
ist eine Kopie des mit bezeichneten Dateideskriptorsword
. Standard in wird angenommen, wennn
es weggelassen wird. Wenn dies der Fallword
ist-
, wird der Dateideskriptorn
geschlossen.Dies ist nicht dasselbe
</dev/null
, da</dev/null
die Standardeingabe immer noch geöffnet und an einen anderen Ort umgeleitet wurde.Sie müssen alle Dateideskriptoren von Prozessen schließen, die an den ssh-Socket angehängt wurden. Andernfalls kann die ssh-Sitzung nicht geschlossen werden.
Sie können den Befehl auf einem Remote-Computer ausführen, ohne ihn an die SSH-Sitzung anzuhängen. Verwenden Sie dazu screen oder tmux :
quelle