C’est une question que j’ai déjà vue à de très nombreuses reprises, et pourtant, la solution est finalement très simple. Vu que je me sers d’ici comme un carnet de notes et mémo autant vous en faire profiter non ? La question est donc comment faire pour lancer un script sur un serveur distant avec SSH et qu’il continue à tourner une fois que l’on ferme la fenêtre de son terminal ?
En effet, quand vous vous connectez à un serveur en SSH, si vous fermez la fenêtre, le script que vous avez lancé avec votre utilisateur s’arrête alors. Sur macOS avec le terminal par défaut, vous avez même une fenêtre qui s’affiche pour vous demander si vous êtes bien sur de là fermer.
Si vous le faites cela va donc arrêter le processus en cours que vous avez lancé via SSH, dommage pour un script qui est censé tourner pendant des heures. Vous ne pouvez pas laisser la fenêtre du terminal et surtout votre ordinateur ouvert dessus de manière illimité. Si vous avez un problème de connexion internet, c’est pas bon non plus et risque de couper l’exécution de votre script …
C’est bien le but d’un serveur, avoir des scripts qui tournent à distance en autonomie et ne pas être dépendant de votre ordinateur en local. Rassurez vous il y a une solution très légère et qui marche très bien, c’est la commande nohup.
nohup : c’est quoi cette commande ?
La commande nohup, abréviation de » no hang up » est utilisée pour exécuter une commande ou un script de manière à ce qu’elle continue de s’exécuter même si la session terminal depuis laquelle elle a été lancée est fermée ou interrompue. Plus précisément, nohup vous permet de détacher une commande ou un script de la session de terminal courante et de le placer dans un processus indépendant. Elle permet ainsi de garantir la persistance de l’exécution de la commande ou du script.
Cette commande nohup est souvent utilisée pour lancer des scripts qui nécessitent une longue durée d’exécution et qu’il est préférable à d’exécuter en arrière-plan. Vous pouvez aussi l’utiliser pour laisser tourner des script qui s’exécutent pour faire de la maintenance par exemple. Regardez du côté de cron qui sera d’ailleurs peut être plus pratique pour faire cela, mais nohup permet de le faire aussi de manière indirecte avec un sleep par exemple. C’est surtout dans le cas de scripts qui mettent beaucoup de temps à s’exécuter que je l’utilise, pour de petits scripts ça ne sert bien évidemment pas à grand chose.
Comment utiliser nohup ?
Pour utiliser nohup, rien de bien compliqué vous allez le voir. Dans le premier cas, on va utiliser cet outil de la manière la plus basique sans le moindre paramètre :
nohup ./votre_script.sh &
Cette commande va donc exécuter votre_script.sh dans un nouveau processus. Vous pouvez alors fermer la session avec votre serveur et quitter le terminal sans crainte. Il y a cependant une première chose à dire. Un fichier nohup.out sera généré dans le même répertoire que votre script, il contient l’état d’exécution du script et les messages si votre script en renvoie normalement, vous pouvez donc suivre ce qu’il se passe en consultant ce fichier. Le » 2>&1 » redirige la sortie d’erreur (stderr) vers la même destination que la sortie standard (stdout). Autre petite précision, le » & » à la fin de la commande permettra de lancer le script en arrière-plan et de libérer le terminal pour récupérer la main pour lancer une autre commande.
Si vous voulez renvoyer la sortie de ce script dans un fichier de log personnalisé avec un nom en particulier, vous pouvez alors faire comme ceci :
nohup ./votre_script.sh > monscript_nohup.log 2>&1 &
Cette commande exécutera votre script avec nohup et redirigera la sortie standard (stdout) et la sortie d’erreur (stderr) vers un fichier nommé » monscript_nohup.log » dans le répertoire courant. Si vous souhaitez placer le fichier de sortie dans un répertoire spécifique, vous pouvez spécifier le chemin complet vers le fichier de sortie. Par exemple, si vous voulez que le fichier « monscript_nohup.log » soit enregistré dans le répertoire » /home/monutilisateur/logs/monscript_nohup.log « , vous pouvez utiliser la commande suivante :
nohup ./votre_script.sh > /home/monutilisateur/logs/monscript_nohup.log 2>&1 &
Faites bien attention aux droits si vous voulez aller ranger ce fichier ailleurs, il faut que votre utilisateur puisse aller écrire dans le dossier que vous avez choisi. Enfin dernière solution, qui peut être utilisé dans certains cas, si vous ne voulez pas avoir de fichier de retour. Dans ce cas pas de problème, on va rediriger la sortie différemment de cette manière :
nohup ./votre_script.sh > /dev/null 2>&1 &
Cette commande nohup avec ce chemin de fichier redirigera la sortie standard (stdout) et la sortie d’erreur (stderr) vers /dev/null. Cela signifie que toutes les sorties du script seront supprimées et ne seront pas écrites.
Voilà vous savez maintenant lancer un script sur un serveur dans une session SSH et vous pouvez fermer la session et quitter le terminal, le script continuera de s’exécuter sur le serveur.