Un script shell peut perdre ses descripteurs de fichier standard et autres si l'autre extrémité disparaît. Cela peut se produire en mettant fin à un ssh client utilisé pour lancer le script :
$ ssh localhost test
^C
Cela lance un bash script appelé test via SSH et un Ctrl C est utilisé pour terminer le ssh commande. Cela ne met pas fin au test qui continue de s'exécuter mais ferme les descripteurs de fichiers joints (par exemple, entrée/sortie/erreur standard).
Si test essaie d'utiliser ces descripteurs de fichiers fermés, il se terminera par un SIGPIPE . Un simple echo suffira.
Une des choses test pourrait avoir est un log fonction qui utilise echo pour écrire des messages dans le journal systemd et également dans l'erreur standard. Quelque chose comme ça :
log() {
echo "$*" | systemd-cat -t test
echo >&2 "$*"
}
Le deuxième echo lève un SIGPIPE après le ssh session est tuée (Ctrl C ). Cela peut être protégé contre, afin que l'exécution continue sans le echo offensant , en mettant le echo dans un sous-shell :
( echo >&2 "$*" )
Mais existe-t-il un meilleur moyen ?
Réponse acceptée :
Vous pouvez si vous le souhaitez ignorer SIGPIPE dans le script :
trap "" PIPE