Comment exécuter un script Python en arrière-plan après une déconnexion SSH ?

Publié 17 octobre 2024

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 :

  1. Ouvrez votre terminal ou votre session SSH.
  2. Allez dans le répertoire contenant votre script Python.
  3. 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 :

  1. Démarrez une nouvelle session Screen :

    screen -S mon_script_python
  2. Exécutez votre script Python :

    python bgservice.py
  3. 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 :

  1. Démarrez une nouvelle session Tmux :

    tmux new -s mon_script_python
  2. Exécutez votre script Python :

    python bgservice.py
  3. 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 :

  1. Installez Supervisor :

    sudo apt-get install supervisor
  2. Créez un fichier de configuration pour votre script Python :

    sudo nano /etc/supervisor/conf.d/bgservice.conf
  3. 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
  4. 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 :

  1. Créez un fichier de service :

    sudo nano /etc/systemd/system/bgservice.service
  2. 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
  3. 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.