Un script de shell puede perder su estándar y otros descriptores de archivo si el otro extremo desaparece. Una forma en que esto puede suceder es terminando un ssh
cliente utilizado para ejecutar el script:
$ ssh localhost test
^C
Esto lanza un bash
script llamado test
sobre SSH y un Ctrl C se utiliza para terminar el ssh
dominio. Esto no termina test
que continúa ejecutándose pero cierra los descriptores de archivos adjuntos (por ejemplo, entrada/salida/error estándar).
Si test
intenta usar esos descriptores de archivos cerrados, entonces terminará con un SIGPIPE
. Un simple echo
será suficiente.
Una de las cosas test
podría tener es un log
función que usa echo
para escribir mensajes en el diario systemd y también en el error estándar. Algo como esto:
log() {
echo "$*" | systemd-cat -t test
echo >&2 "$*"
}
El segundo echo
genera un SIGPIPE
después del ssh
la sesión se cierra (Ctrl C ). Se puede proteger contra esto, para que la ejecución continúe sin el echo
ofensivo , poniendo el echo
en una subcapa:
( echo >&2 "$*" )
¿Pero hay una mejor manera?
Respuesta aceptada:
Si lo desea, puede ignorar SIGPIPE en el script:
trap "" PIPE