La plupart du temps, vous vous connectez au serveur distant via ssh. Si vous démarrez un script shell ou une commande et que vous quittez (abandonnez la connexion distante), le processus/commande sera tué. Parfois, un travail ou une commande prend beaucoup de temps. Si vous n’êtes pas sûr de la fin du travail, il est préférable de laisser le travail en cours d’exécution en arrière-plan., Mais, si vous vous déconnectez du système, le travail sera arrêté et terminé par votre shell. Que faites-vous pour garder le travail en cours d’exécution en arrière-plan lorsque le processus obtient SIGHUP?
commande nohup à la rescousse
dans ces situations, nous pouvons utilisernohup
ligne de commande-utilitaire qui permet d’exécuter une commande / processus ou un script shell qui peut continuer à fonctionner en arrière-plan après la déconnexion d’un shell.
nohup est une commande POSIX pour ignorer le signal HUP (hangup)., Le signal HUP est, par convention, la façon dont un terminal avertit les processus dépendants de la déconnexion.
la sortie qui irait normalement au terminal va dans un fichier appelé nohup.si elle n’a pas déjà été redirigé.
nohup commande syntaxe:
La syntaxe est comme suit
$ nohup command-name &$ exit
ou
$ nohup /path/to/command-name arg1 arg2 > myoutput.log &$ exit
Où
-
command-name
: est un nom d’un script shell ou le nom de la commande. Vous pouvez passer un argument à une commande ou à un script shell., -
&
: nohup ne met pas automatiquement la commande qu’il exécute en arrière-plan; vous devez le faire explicitement, en terminant la ligne de commande par un symbole&. -
exit
: après nohup et & lancez la commande en arrière-plan, vous devrez tapez exit ou CTRL-D pour revenir à bash curseur.,
utilisez la commande jobs-l pour lister tous les travaux:
$ jobs -l
exemples de commandes nohup
tout d’abord, connectez-vous au serveur distant en utilisant la commande ssh:
$ ssh [email protected]
je vais exécuter un script shell appelé pullftp.sh:
$ nohup pullftp.sh &
tapez exit ou appuyez sur CTRL + D pour quitter le serveur distant:
> exit
dans cet exemple, je vais trouver tous les programmes et scripts avec le bit setuid activé, entrez:
$ nohup find / -xdev -type f -perm +u=s -print > out.txt &
tapez exit ou appuyez sur Ctrl + D pour quitter le serveur distant., Le travail continue de fonctionner après votre sortie.
> exit
nohup est souvent utilisé en combinaison avec la commande nice pour exécuter des processus sur une priorité inférieure.
veuillez noter que nohup ne modifie pas la priorité de planification de la commande; utilisez la commande nice à cet effet. Par exemple:
$ nohup nice -n -5 ls / > out.txt &
comme vous pouvez le voir, nohup continue à exécuter les processus après votre sortie d’un shell. Lisez la page de manuel de nohup (1) et nice(1) pour plus d’informations. Veuillez noter que nohup est presque disponible sur les variantes Solaris/BSD/Linux/UNIX.,
Quelle est la différence entre nohup et esperluette (&)
les Deux nohup myprocess.out &
ou myprocess.out &
définir myprocess.pour exécuter en arrière-plan. Après l’arrêt du terminal, le processus est toujours en cours d’exécution. Quelle est la différence entre eux?
nohup
capte le signal de raccrochage (voir man 7 signal
) alors que l’Esperluette ne le fait pas (sauf que le shell est confgured de cette façon ou n’envoie pas SIGHUP
du tout).,
normalement, lors de l’exécution d’une commande utilisant&
et en quittant le shell par la suite, le shell mettra fin à la sous-commande avec le signal de raccrochage (kill -SIGHUP <pid>
). Cela peut être évité en utilisant nohup
, car il capte le signal et l’ignore afin qu’il n’atteigne jamais l’application réelle.
Si vous utilisez bash, vous pouvez utiliser la commandeshopt | grep hupon
pour savoir si votre shell envoie SIGHUP à ses processus enfants ou non. S’il est désactivé, les processus ne seront pas terminés, comme cela semble être le cas pour vous., Plus d’informations sur la façon dont bash termine les applications peuvent être trouvées ici.
Il y a des cas oùnohup
ne fonctionne pas, par exemple lorsque le processus que vous démarrez reconnecte le signalSIGHUP
, comme c’est le cas ici.
sujets avancés
travaux existants, processus
certains shells (par exemple bash) fournissent un shell intégré qui peut être utilisé pour empêcher SIGHUP d’être envoyé ou propagé aux travaux existants, même s’ils n’ont pas été démarrés avec nohup., Dans bash, cela peut être obtenu en utilisant disown -h job
; l’utilisation du même élément sans arguments supprime le travail de la table de travail, ce qui implique également que le travail ne recevra pas le signal. Avant d’utiliser disown
sur un travail actif, il doit être arrêté par Ctrl-Z
, et poursuivi en arrière-plan par la commande bg
. Une autre option bash pertinente est shopt huponexit
, qui envoie automatiquement le signal HUP aux travaux lorsque le shell sort normalement.,
Les versions AIX et Solaris de nohup ont une option-p
qui modifie un processus en cours d’exécution pour ignorer les futurs signaux SIGHUP. Contrairement au disown
intégré à bash, nohup -p
accepte les ID de processus.
surmonter la suspension
notez que les tâches backgrounded nohupping sont généralement utilisées pour éviter de les terminer lors de la déconnexion d’une session SSH distante. Un autre problème qui se pose souvent dans cette situation est que ssh refuse de se déconnecter (« se bloque”), car il refuse de perdre des données de/vers le travail d’arrière-plan., Ce problème peut également être résolu en redirigeant les trois flux d’e/s:
$ nohup ./myprogram > foo.out 2> foo.err < /dev/null &
notez également qu’une session SSH de fermeture n’envoie pas toujours un signal HUP aux processus en fonction. Entre autres, cela dépend si un pseudo-terminal a été alloué ou non.
Alternatives
multiplexeur de Terminal
un multiplexeur de terminal peut exécuter une commande dans une session séparée, détachée du terminal en cours, ce qui signifie que si la session en cours se termine, la session détachée et ses processus associés continuent de s’exécuter. On peut ensuite rattacher à la session plus tard.,
par exemple, l’appel suivant de screen s’exécutera somescript.sh en arrière-plan d’une session détachée:
screen -A -m -d -S somename ./somescript.sh &
disown command
la commande disown est utilisée pour supprimer des tâches de la table de tâches ou pour marquer des tâches afin qu’un signal SIGHUP ne soit pas envoyé à la fin de la session.
Voici comment vous pouvez l’essayer:
$ pullftp.sh &$ disown -h$ exit
dans le bash bash(1), l’homme de la page:
Par défaut, supprime chaque JOBSPEC argument de la table active de l’emploi., Si l’option-h est donnée, le travail n’est pas supprimé de la table, mais est marqué de sorte que SIGHUP n’est pas envoyé au travail si le shell reçoit un SIGHUP. L’option-a, Lorsque JOBSPEC n’est pas fourni, signifie supprimer toutes les tâches de la table de tâches; l’option-r signifie supprimer uniquement les tâches en cours d’exécution.
la commande
Vous pouvez utiliser la commande de file d’attente d’un emploi pour exécution ultérieure. Par exemple, vous pouvez exécuter pullftp.sh script à la file d’attente (une minute) exécution ultérieure:
$ echo "pullftp.sh" | at now + 1 minute