Come eseguire uno script Python in background dopo il logout SSH?

Pubblicato 17 ottobre 2024

Problema: Esecuzione di Script Python Dopo la Disconnessione SSH

L'esecuzione di script Python su un server remoto può interrompersi quando la connessione SSH si chiude. Questo problema impedisce agli script a lunga durata di completare i loro compiti. È necessario un modo per mantenere gli script Python in esecuzione in background dopo la disconnessione da una sessione SSH.

Soluzione: Utilizzo del Comando nohup

Cos'è nohup?

Il comando nohup, abbreviazione di "no hangup", è uno strumento che permette di eseguire processi che continuano a funzionare anche dopo la disconnessione da una shell. Impedisce al sistema di inviare il segnale di interruzione (SIGHUP) al processo in esecuzione quando il terminale si chiude. Questo segnale solitamente termina i processi collegati al terminale chiuso.

Implementazione di nohup con script Python

Per utilizzare nohup con il tuo script Python:

  1. Apri il terminale o la sessione SSH.
  2. Vai alla directory contenente il tuo script Python.
  3. Esegui questo comando:

    nohup python bgservice.py &

L'e commerciale (&) alla fine del comando dice al sistema di eseguire il processo in background. Questo ti permette di utilizzare il terminale per altri compiti mentre il tuo script è in esecuzione.

Suggerimento: Verifica dei Processi in Esecuzione

Per verificare se il tuo processo nohup è in esecuzione, usa il comando 'ps':

ps aux | grep python

Questo mostrerà tutti i processi Python in esecuzione, incluso il tuo comando nohup.

Gestione dell'output con nohup

Per impostazione predefinita, nohup invia l'output del comando a un file chiamato "nohup.out" nella directory corrente. Se vuoi utilizzare un file di output personalizzato, puoi modificare il comando in questo modo:

nohup python bgservice.py > output_personalizzato.log 2>&1 &

Questo comando invia sia l'output standard che l'errore standard al file "output_personalizzato.log".

Metodi Alternativi per l'Esecuzione in Background

Screen: Un Multiplexer di Terminale

Screen è un multiplexer di terminale che ti permette di eseguire più sessioni di terminale in una finestra. Aiuta a mantenere i processi in esecuzione dopo la disconnessione da una sessione SSH.

Per utilizzare Screen con il tuo script Python:

  1. Avvia una nuova sessione Screen:

    screen -S mio_script_python
  2. Esegui il tuo script Python:

    python bgservice.py
  3. Staccati dalla sessione Screen premendo Ctrl+A, poi D.

Per ricollegarti alla sessione in seguito, usa:

screen -r mio_script_python

Suggerimento: Gestione di Più Sessioni Screen

Per gestire più sessioni Screen, usa il comando screen -ls per elencare tutte le sessioni attive. Questo ti permette di vedere quali sessioni sono in esecuzione e i loro nomi, facilitando il passaggio tra diversi processi in background.

Tmux: Alternativa al Multiplexer di Terminale

Tmux è un altro multiplexer di terminale simile a Screen. Ha più funzionalità ed è spesso considerato più facile da usare.

Per utilizzare Tmux con il tuo script Python:

  1. Avvia una nuova sessione Tmux:

    tmux new -s mio_script_python
  2. Esegui il tuo script Python:

    python bgservice.py
  3. Staccati dalla sessione Tmux premendo Ctrl+B, poi D.

Per ricollegarti alla sessione in seguito, usa:

tmux attach -t mio_script_python

Rispetto a Screen, Tmux offre:

  • Migliore gestione delle finestre
  • Più opzioni di personalizzazione
  • Configurazione più semplice della barra di stato

Sia Screen che Tmux sono buone opzioni per mantenere gli script Python in esecuzione in background. La scelta tra i due spesso dipende dalle preferenze personali.

Strumenti di Gestione dei Processi

Supervisor: Un Sistema di Controllo dei Processi

Supervisor è un sistema di controllo dei processi per sistemi operativi Unix-like. Gestisce script Python a lunga durata. Supervisor avvia, ferma e monitora i processi, e può riavviarli in caso di crash.

Vantaggi dell'uso di Supervisor per script Python:

  • Riavvio automatico in caso di crash
  • Gestione dei processi tramite interfaccia web o linea di comando
  • Logging dell'output dei processi
  • Raggruppamento dei processi per la gestione

Configurazione di base per Supervisor:

  1. Installa Supervisor:

    sudo apt-get install supervisor
  2. Crea un file di configurazione per il tuo script Python:

    sudo nano /etc/supervisor/conf.d/bgservice.conf
  3. Aggiungi il seguente contenuto al file:

    [program:bgservice]
    command=python /percorso/verso/bgservice.py
    directory=/percorso/verso/directory/script
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/bgservice.err.log
    stdout_logfile=/var/log/bgservice.out.log
  4. Ricarica Supervisor e avvia il tuo programma:

    sudo supervisorctl reread
    sudo supervisorctl update
    sudo supervisorctl start bgservice

Suggerimento: Configurazione delle Variabili d'Ambiente

Per impostare variabili d'ambiente per il tuo script Python in Supervisor, aggiungi la seguente riga al tuo file di configurazione:

environment=VAR_AMB1="valore1",VAR_AMB2="valore2"

Questo ti permette di passare opzioni di configurazione al tuo script senza modificare il codice.

systemd: Gestore di Sistema e Servizi

systemd è un gestore di sistema e servizi per sistemi operativi Linux. Gestisce gli script Python come servizi di sistema.

Utilizzo di systemd per la gestione degli script Python:

  1. Crea un file di servizio:

    sudo nano /etc/systemd/system/bgservice.service
  2. Aggiungi il seguente contenuto:

    [Unit]
    Description=Script Python Servizio in Background
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/python3 /percorso/verso/bgservice.py
    Restart=always
    User=tuoutente
    
    [Install]
    WantedBy=multi-user.target
  3. Ricarica systemd, abilita e avvia il servizio:

    sudo systemctl daemon-reload
    sudo systemctl enable bgservice.service
    sudo systemctl start bgservice.service

Per gestire il tuo servizio systemd:

  • Controlla lo stato: sudo systemctl status bgservice.service
  • Ferma il servizio: sudo systemctl stop bgservice.service
  • Riavvia il servizio: sudo systemctl restart bgservice.service

Supervisor e systemd offrono soluzioni per la gestione di script Python a lunga durata. systemd è più integrato nei sistemi Linux moderni, mentre Supervisor si concentra sulla gestione dei processi.