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