GNU/Linux >> Tutoriels Linux >  >> Linux

Quand utiliser Nohup ?

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 SSH

Quelqu'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 😉

Connexe :Debian – Pourquoi « ls » enveloppe-t-il soudainement des éléments avec des espaces entre guillemets simples ?

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 le SIGHUP à tous les travaux, en cours d'exécution ou
arrêtés. Les travaux arrêtés sont envoyés SIGCONT pour s'assurer qu'ils reçoivent le SIGHUP .

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.


Linux
  1. Quand dois-je utiliser une barre oblique finale sur un répertoire ? ?

  2. Quand et pourquoi devrais-je utiliser Apt-get Update ?

  3. Supprimer la mémoire partagée posix lorsqu'elle n'est pas utilisée ?

  4. Utiliser un appareil via SSH ?

  5. Quand utiliser Bash et quand utiliser Perl/Python/Ruby ?

Utilisez ce script Bash utile pour observer les étoiles

Comment utiliser le transfert de port SSH

Comment utiliser la commande Linux nohup

Comment utiliser SSH pour se connecter à un serveur distant

Comment utiliser une clé SSH avec des utilisateurs non root

Installer et utiliser WinSCP