Problème : Exécuter des scripts Python après une déconnexion SSH
L'exécution de scripts Python sur un serveur distant peut s'arrêter lorsque la connexion SSH se ferme. Ce problème empêche les scripts à longue durée d'exécution de terminer leurs tâches. Vous avez besoin d'un moyen de maintenir l'exécution des scripts Python en arrière-plan après vous être déconnecté d'une session SSH.
Solution : Utiliser la commande nohup
Qu'est-ce que nohup ?
La commande nohup, abréviation de "no hangup", est un outil qui vous permet d'exécuter des processus qui continuent à fonctionner après votre déconnexion d'un shell. Elle empêche le système d'envoyer le signal de déconnexion (SIGHUP) au processus en cours d'exécution lorsque le terminal se ferme. Ce signal met généralement fin aux processus liés au terminal fermé.
Mise en œuvre de nohup avec des scripts Python
Pour utiliser nohup avec votre script Python :
- Ouvrez votre terminal ou votre session SSH.
- Allez dans le répertoire contenant votre script Python.
-
Exécutez cette commande :
nohup python bgservice.py &
L'esperluette (&) à la fin de la commande indique au système d'exécuter le processus en arrière-plan. Cela vous permet d'utiliser le terminal pour d'autres tâches pendant que votre script s'exécute.
Conseil: Vérifier les processus en cours d'exécution
Pour vérifier si votre processus nohup est en cours d'exécution, utilisez la commande 'ps' :
ps aux | grep python
Cela affichera tous les processus Python en cours d'exécution, y compris votre commande nohup.
Gestion de la sortie avec nohup
Par défaut, nohup envoie la sortie de la commande dans un fichier nommé "nohup.out" dans le répertoire courant. Si vous souhaitez utiliser un fichier de sortie personnalisé, vous pouvez modifier la commande comme suit :
nohup python bgservice.py > custom_output.log 2>&1 &
Cette commande redirige à la fois la sortie standard et l'erreur standard vers le fichier "custom_output.log".
Méthodes alternatives pour l'exécution en arrière-plan
Screen : Un multiplexeur de terminal
Screen est un multiplexeur de terminal qui vous permet d'exécuter plusieurs sessions de terminal dans une seule fenêtre. Il aide à maintenir les processus en cours d'exécution après vous être déconnecté d'une session SSH.
Pour utiliser Screen avec votre script Python :
-
Démarrez une nouvelle session Screen :
screen -S mon_script_python
-
Exécutez votre script Python :
python bgservice.py
-
Détachez-vous de la session Screen en appuyant sur Ctrl+A, puis D.
Pour vous rattacher à la session ultérieurement, utilisez :
screen -r mon_script_python
Conseil: Gérer plusieurs sessions Screen
Pour gérer plusieurs sessions Screen, utilisez la commande screen -ls
pour lister toutes les sessions actives. Cela vous permet de voir quelles sessions sont en cours d'exécution et leurs noms, facilitant ainsi le passage entre différents processus en arrière-plan.
Tmux : Alternative au multiplexeur de terminal
Tmux est un autre multiplexeur de terminal similaire à Screen. Il dispose de plus de fonctionnalités et est souvent considéré comme plus facile à utiliser.
Pour utiliser Tmux avec votre script Python :
-
Démarrez une nouvelle session Tmux :
tmux new -s mon_script_python
-
Exécutez votre script Python :
python bgservice.py
-
Détachez-vous de la session Tmux en appuyant sur Ctrl+B, puis D.
Pour vous rattacher à la session ultérieurement, utilisez :
tmux attach -t mon_script_python
Par rapport à Screen, Tmux offre :
- Une meilleure gestion des fenêtres
- Plus d'options de personnalisation
- Une configuration plus facile de la barre d'état
Screen et Tmux sont tous deux efficaces pour maintenir l'exécution des scripts Python en arrière-plan. Le choix entre les deux dépend souvent de vos préférences personnelles.
Outils de gestion des processus
Supervisor : Un système de contrôle des processus
Supervisor est un système de contrôle des processus pour les systèmes de type Unix. Il gère les scripts Python à longue durée d'exécution. Supervisor démarre, arrête et surveille les processus, et peut les redémarrer en cas de plantage.
Avantages de l'utilisation de Supervisor pour les scripts Python :
- Redémarrage automatique en cas de plantage
- Gestion des processus via une interface web ou en ligne de commande
- Journalisation de la sortie des processus
- Regroupement des processus pour une gestion simplifiée
Configuration de base pour Supervisor :
-
Installez Supervisor :
sudo apt-get install supervisor
-
Créez un fichier de configuration pour votre script Python :
sudo nano /etc/supervisor/conf.d/bgservice.conf
-
Ajoutez le contenu suivant au fichier :
[program:bgservice] command=python /chemin/vers/bgservice.py directory=/chemin/vers/repertoire/script autostart=true autorestart=true stderr_logfile=/var/log/bgservice.err.log stdout_logfile=/var/log/bgservice.out.log
-
Rechargez Supervisor et démarrez votre programme :
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start bgservice
Conseil: Configurer des variables d'environnement
Pour définir des variables d'environnement pour votre script Python dans Supervisor, ajoutez la ligne suivante à votre fichier de configuration :
environment=VAR_ENV1="valeur1",VAR_ENV2="valeur2"
Cela vous permet de passer des options de configuration à votre script sans modifier le code.
systemd : Gestionnaire de système et de services
systemd est un gestionnaire de système et de services pour les systèmes d'exploitation Linux. Il gère les scripts Python comme des services système.
Utilisation de systemd pour la gestion des scripts Python :
-
Créez un fichier de service :
sudo nano /etc/systemd/system/bgservice.service
-
Ajoutez le contenu suivant :
[Unit] Description=Script Python Service d'arrière-plan After=network.target [Service] ExecStart=/usr/bin/python3 /chemin/vers/bgservice.py Restart=always User=votre_nom_utilisateur [Install] WantedBy=multi-user.target
-
Rechargez systemd, activez et démarrez le service :
sudo systemctl daemon-reload sudo systemctl enable bgservice.service sudo systemctl start bgservice.service
Pour gérer votre service systemd :
- Vérifier l'état :
sudo systemctl status bgservice.service
- Arrêter le service :
sudo systemctl stop bgservice.service
- Redémarrer le service :
sudo systemctl restart bgservice.service
Supervisor et systemd offrent des solutions pour gérer les scripts Python à longue durée d'exécution. systemd est plus intégré aux systèmes Linux modernes, tandis que Supervisor se concentre sur la gestion des processus.