Ein Shell-Skript kann seine Standard- und andere Dateideskriptoren verlieren, wenn das andere Ende wegfällt. Eine Möglichkeit, dies zu erreichen, ist das Beenden eines ssh Client zum Starten des Skripts:
$ ssh localhost test
^C
Dies startet eine bash Skript namens test über SSH und ein Ctrl C wird verwendet, um ssh zu beenden Befehl. test wird dadurch nicht beendet die weiter läuft, aber die angehängten Dateideskriptoren schließt (z. B. Standard-Eingabe/Ausgabe/Fehler).
Wenn test versucht, diese geschlossenen Dateideskriptoren zu verwenden, dann wird es mit einem SIGPIPE beendet . Ein einfaches echo reicht aus.
Eines der Dinge test haben könnte, ist ein log Funktion, die echo verwendet um Nachrichten in das systemd-Journal und auch in den Standardfehler zu schreiben. Etwa so:
log() {
echo "$*" | systemd-cat -t test
echo >&2 "$*"
}
Das zweite echo löst ein SIGPIPE aus nach dem ssh Sitzung beendet (Ctrl C ). Dagegen kann geschützt werden, sodass die Ausführung ohne das störende echo fortgesetzt wird , indem Sie das echo setzen in einer Subshell:
( echo >&2 "$*" )
Aber gibt es einen besseren Weg?
Akzeptierte Antwort:
Sie können SIGPIPE im Skript ignorieren, wenn Sie möchten:
trap "" PIPE