J'aimerais connaître le but de nohup
ces jours-ci .
Je demande parce que j'ai lu ceci
Nohup est l'abréviation de "No Hangups". Ce n'est pas une commande que vous exécutez par elle-même. Nohup est une commande supplémentaire qui indique au système Linux de ne pas arrêter une autre commande une fois qu'elle a démarré. Cela signifie qu'il continuera à fonctionner jusqu'à ce qu'il soit terminé, même si l'utilisateur qui l'a lancé se déconnecte. La syntaxe de nohup est simple et ressemble à ceci :
nohup sh votre-script.sh &
Remarquez le "&" à la fin de la commande. Cela déplace la commande en arrière-plan, libérant ainsi le terminal dans lequel vous travaillez.
Nohup fonctionne avec à peu près n'importe quelle commande que vous exécutez dans le terminal. Il peut être exécuté avec des scripts personnalisés ainsi qu'avec des commandes système standard et des utilitaires de ligne de commande.
En utilisant des distributions Linux telles que SLES 11.4 ou RHEL/CentOS 7.x, je peux
- connexion à distance à Linux sur le réseau via SSH
- exécutez le programme simple ci-dessous, ou tout autre, en faisant
./a.out &
- déconnectez-vous de Linux ; tapez exit dans le terminal mastic SSH
- mon exemple de programme ci-dessous, ou tout autre, y compris les scripts shell bash, csh ou tcsh, s'exécute jusqu'à la fin sans avoir besoin de
nohup
- taper exit dans putty pour fermer une session SSH, je pense que cela peut être considéré comme une déconnexion ?
Y a-t-il un but ou une valeur avec nouhup
aujourd'hui? Est-ce un noyau>=3.x ? Aussi longtemps que je me souvienne (kernel>=2.6), je n'ai jamais utilisé nohup
et j'ai toujours utilisé &
sans problème.
Quelqu'un peut-il me donner un scénario pratique où nohup
serait utilisé ?
#include <stdlib.h>
#include <stdio.h>
/*
sample C code, to print numbers to a file named zz.tmp
the numbers 0 to 29 over 30 seconds
*/
int main ( int argc, char *argv[] )
{
FILE *fp;
int i;
i = 0;
fp = fopen("zz.tmp", "w" );
while ( i < 30 )
{
fprintf( fp, "%dn", i++ );
sleep( 1 );
}
fclose( fp );
return 0;
}
monsommeil.sh
#!/bin/bash
sleep 1000
Sur Centos 7.7, connexion pc optiplex avec clavier et souris, mon compte est bash. Je fais nohup ./mysleep.sh
puis control-z . Lors de la saisie de jobs
Je vois [1]+ Stopped nohup ./mysleep.sh
Un ps -ef | grep mysleep
montre que l'identifiant de processus existe, mais si je ferme la fenêtre du terminal via X dans le coin supérieur droit, ce processus disparaît, il semble donc nohup
ne fonctionne pas ?
Réponse acceptée :
connexion à distance à Linux sur le réseau via SSH… déconnexion de Linux; tapez
exit
dans le terminal mastic SSHQuelqu'un peut-il me donner un scénario pratique où
nohup
serait utilisé ?
Bien sûr. En supposant que votre shell est bash (voir ci-dessous pourquoi), au lieu de taper exit
ou ^D
, saisissez ~.
au début d'une ligne, ce qui entraînera la déconnexion de votre client ssh :
$ ssh localhost
ssh$ sleep 3600 &
[1] 5765
ssh$ ~.
ssh$ Connection to localhost closed.
$ ps 5765
PID TTY STAT TIME COMMAND
Vous pouvez utiliser votre programme au lieu de sleep
; et au lieu de se déconnecter via ~.
, vous pouvez tuer votre client ssh ou planter la machine sur laquelle il s'exécute. Vous voulez que votre processus survive à cela ? Utilisez nohup
😉
La rupture de la connexion entraînera la sortie du processus serveur qui gère son autre extrémité, ce qui obligera le noyau (n'importe quel noyau Unix/Linux) à détruire le pseudo-terminal créé par ssh et à envoyer un SIGHUP
signal au leader de la session (le shell bash), qui, selon le manuel bash :
Le shell se ferme par défaut à la réception d'un
SIGHUP
. Avant de quitter,
un shell interactif renvoie leSIGHUP
à tous les travaux, en cours d'exécution ou
arrêtés. Les travaux arrêtés sont envoyésSIGCONT
pour s'assurer qu'ils reçoivent leSIGHUP
.
Beaucoup de gens confondent cette fonctionnalité bash avec a) le contrôle normal des tâches implémenté par le noyau, qui n'enverra qu'un SIGCONT
/SIGHUP
associer à l'arrêté , pas à la course emplois [1] et b) une autre fonctionnalité bash (shopt -s huponexit
) qui provoque une connexion bash shell pour envoyer un SIGHUP
à ses travaux même en quittant normalement (par exemple via exit
).
[1] un arrêté job est un job (=groupe de processus) qui contient au moins un processus arrêté. Un processus est arrêté en tant qu'effet de l'action par défaut d'un signal comme SIGTSTP
, SIGSTOP
, SIGTTIN
ou SIGTTOU
. Processus qui "dorment" sur un appel système bloquant comme read
, nanosleep
, select
, etc. ne sont pas considérés comme arrêtés, mais en cours d'exécution.
Pourquoi nohup
peut ne pas toujours aider
nohup
définit simplement la disposition de SIGHUP
à ignorer et fait quelques redirections, il ne garantit pas que le processus ne sera pas tué par d'autres moyens.
a) Si le nohup ..
le travail est arrêté , un bash interactif lui enverra également un SIGTERM
signal, pas seulement un SIGHUP
/SIGCONT
paire :
Si une tentative de sortie de bash est effectuée alors que les tâches sont arrêtées […] le shell affiche un message d'avertissement […] Si une deuxième tentative de sortie est effectuée sans commande intermédiaire, le shell n'affiche pas d'autre avertissement et toutes les tâches arrêtées sont terminé .
[terminé =envoyé un SIGTERM
signal; ceci est une autre fonctionnalité de ksh/bash, non présente dans tous les shells]
Tout cela peut être contourné par des astuces simples comme les doubles fourches et en créant une nouvelle session avec setsid(1)
, mais
b) systemd
peut également "nettoyer" une session déconnectée en tuant de force (avec SIGTERM
suivi de SIGKILL
) tous les processus restants si son KillUserProcesses
le paramètre est activé, ce qui est la valeur par défaut dans certaines distributions.