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