J'ai copié un extrait de Bash en arrière-plan d'une commande ssh exécutée à distance:
ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
Que fait <&-
-il?
Je suppose que c'est la même chose que< /dev/null
Ma prochaine compréhension est que les trois descripteurs de fichiers principaux ( stdin
, stdout
, stderr
) doivent être fermées pour empêcher:
- Le travail est en arrière-plan et le script se termine - en conflit en quelque sorte?
- Lorsque le terminal se ferme, tous les processus qui acceptent stdin du terminal sont fermés?
bash
shell
io-redirection
Eric Francis
la source
la source
ssh -nNT user@remote 'command'
va créer une session SSH non interactive. Ajoutez-le&
en arrière-plan, ajoutez-lenohup
àcommand
pour le faire fonctionner si votre connexion est interrompue.man ssh
suggère que -N désactive entièrement l'exécution d'une commande à distance, et un test rapide le prend en charge.Réponses:
<&-
n'est pas tout à fait la même chose que< /dev/null
.<&-
ferme fd 0, alors< /dev/null
qu'il le redirige depuis l'appareil/dev/null
, qui ne fournit jamais de données et donne toujours EOF en lecture. La différence est principalement qu'unread(2)
appel à partir d'un FD fermé (le<&-
cas) provoquera une erreur avec EBADF, alors qu'un appel à partir d'un FD redirigé nul ne retournera aucun octet lu (condition de fin de fichier). Si votre programme ne lit jamais depuis stdin, la distinction n'a pas d'importance.La fermeture des FD est une bonne pratique si vous mettez en arrière-plan quelque chose, car un processus en arrière-plan se bloque s'il essaie de lire quoi que ce soit sur TTY. Cependant, cet exemple ne gère pas tout ce qu'il devrait; dans l'idéal, il y aurait une
nohup
ou unesetsid
invocation quelque part, pour dissocier pleinement le processus d'arrière-plan.la source
nohup
en plus de fermer les descripteurs de fichiers?setsid some process <&- >path/to/log 2>path/to/error
. La méthode la plus rapide ressemble à quelque chosenohup some process &
.nohup
n'a aucun sens ici.nohup
empêcher le processus de recevoir unHUP
signal lorsque sa borne de commande est fermée. Mais vous n'aviez pas de terminal dans ce cas.Voir
man bash
:la source
[n]<&word
et que le mot contient plus d'un seul chiffre.man bash
incorrect?bash
choisit de l'implémenter de manière saine (pour une définition appropriée de "sain"). D'autres obus peuvent le faire ou non.bash
, nonposix-shell
.<&-
fermer l'entrée standard.La forme générale, définie par POSIX , est:
Son but de créer un descripteur de fichier
n
est une copie du descripteur de fichier désigné parword
. L'entrée standard est supposée sin
est omise, et siword
c'est le cas-
, le descripteur de fichiern
sera fermé.Ce n'est pas la même chose que
</dev/null
, puisque dans le cas de</dev/null
, l'entrée standard est toujours ouverte et a été redirigée vers un autre endroit.Vous devez fermer tous les descripteurs de fichiers des processus qui ont été attachés au socket ssh, sinon la session ssh ne peut pas se fermer.
Vous pouvez exécuter la commande sur une machine distante sans la rattacher à la session ssh, en utilisant screen ou tmux :
la source