GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo evitar un script de Shell el Sigpipe que sería causado por el uso de un descriptor de archivo cerrado?

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

Linux
  1. ¿Cómo crear un archivo temporal en Shell Script?

  2. Echo To File Descriptor sobrescribe el archivo?

  3. ¿Cómo agregar datos al búfer en el script de Shell?

  4. ¿Cómo obtener el nombre de la rama git actual en una variable en un script de Shell?

  5. Cómo ejecutar un archivo sin extensión .sh en shell

Cómo usar el comando diff de Linux

Cómo usar variables en secuencias de comandos de Shell

Cómo usar Sudo y el archivo Sudoers

Cómo usar el comando ftp de Linux para cargar y descargar archivos en el shell

Cómo usar operadores de prueba de archivos Bash en Linux

¿Cómo usar el comando Gzip en Linux?