Hoe Een Python Script Op De Achtergrond Uitvoeren Na SSH Logout?

Gepubliceerd 7 augustus 2024

Probleem: Python-scripts Uitvoeren Na SSH-afmelding

Het uitvoeren van Python-scripts op een externe server kan stoppen wanneer de SSH-verbinding wordt verbroken. Dit probleem verhindert dat langlopende scripts hun taken voltooien. Je hebt een manier nodig om Python-scripts op de achtergrond te laten draaien nadat je bent afgemeld van een SSH-sessie.

Oplossing: Het nohup-commando Gebruiken

Wat is nohup?

Het nohup-commando, kort voor "no hangup," is een hulpmiddel waarmee je processen kunt uitvoeren die blijven draaien nadat je bent afgemeld van een shell. Het voorkomt dat het systeem het hangup-signaal (SIGHUP) naar het actieve proces stuurt wanneer de terminal wordt gesloten. Dit signaal beëindigt normaal gesproken processen die gekoppeld zijn aan de gesloten terminal.

nohup Implementeren met Python-scripts

Om nohup met je Python-script te gebruiken:

  1. Open je terminal of SSH-sessie.
  2. Ga naar de map met je Python-script.
  3. Voer dit commando uit:

    nohup python bgservice.py &

Het ampersand-teken (&) aan het einde van het commando vertelt het systeem om het proces op de achtergrond uit te voeren. Hierdoor kun je de terminal voor andere taken gebruiken terwijl je script draait.

Tip: Controleer Actieve Processen

Om te controleren of je nohup-proces actief is, gebruik het 'ps'-commando:

ps aux | grep python

Dit toont alle actieve Python-processen, inclusief je nohup-commando.

Output beheren met nohup

Standaard stuurt nohup de uitvoer van het commando naar een bestand genaamd "nohup.out" in de huidige map. Als je een aangepast uitvoerbestand wilt gebruiken, kun je het commando als volgt wijzigen:

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

Dit commando stuurt zowel standaard uitvoer als standaard foutmeldingen naar het bestand "custom_output.log".

Alternatieve Methoden voor Achtergronduitvoering

Screen: Een Terminal Multiplexer

Screen is een terminal multiplexer waarmee je meerdere terminalsessies in één venster kunt uitvoeren. Het helpt processen actief te houden nadat je de verbinding met een SSH-sessie verbreekt.

Om Screen met je Python-script te gebruiken:

  1. Start een nieuwe Screen-sessie:

    screen -S my_python_script
  2. Voer je Python-script uit:

    python bgservice.py
  3. Ontkoppel van de Screen-sessie door op Ctrl+A te drukken, gevolgd door D.

Om later opnieuw aan de sessie te koppelen, gebruik:

screen -r my_python_script

Tip: Meerdere Screen-sessies Beheren

Om meerdere Screen-sessies te beheren, gebruik het commando screen -ls om alle actieve sessies weer te geven. Hierdoor kun je zien welke sessies actief zijn en hun namen, waardoor het gemakkelijker wordt om te schakelen tussen verschillende achtergrondprocessen.

Tmux: Terminal Multiplexer Alternatief

Tmux is een andere terminal multiplexer zoals Screen. Het heeft meer functies en wordt vaak gezien als gebruiksvriendelijker.

Om Tmux met je Python-script te gebruiken:

  1. Start een nieuwe Tmux-sessie:

    tmux new -s my_python_script
  2. Voer je Python-script uit:

    python bgservice.py
  3. Ontkoppel van de Tmux-sessie door op Ctrl+B te drukken, gevolgd door D.

Om later opnieuw aan de sessie te koppelen, gebruik:

tmux attach -t my_python_script

Vergeleken met Screen biedt Tmux:

  • Beter vensterbeheer
  • Meer aanpassingsmogelijkheden
  • Eenvoudigere statusbalk-instelling

Zowel Screen als Tmux zijn goed voor het actief houden van Python-scripts op de achtergrond. De keuze tussen beide hangt vaak af van wat je prefereert.

Procesbeheer Tools

Supervisor: Een Procescontrolesysteem

Supervisor is een procescontrolesysteem voor Unix-achtige besturingssystemen. Het beheert langlopende Python-scripts. Supervisor start, stopt en bewaakt processen, en kan ze herstarten als ze crashen.

Voordelen van Supervisor gebruiken voor Python-scripts:

  • Automatische herstart bij crashes
  • Procesbeheer via een webinterface of commandoregel
  • Logboekregistratie van procesuitvoer
  • Groepeer processen voor beheer

Basis installatie en configuratie voor Supervisor:

  1. Installeer Supervisor:

    sudo apt-get install supervisor
  2. Maak een configuratiebestand aan voor je Python-script:

    sudo nano /etc/supervisor/conf.d/bgservice.conf
  3. Voeg de volgende inhoud toe aan het bestand:

    [program:bgservice]
    command=python /path/to/bgservice.py
    directory=/path/to/script/directory
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/bgservice.err.log
    stdout_logfile=/var/log/bgservice.out.log
  4. Herlaad Supervisor en start je programma:

    sudo supervisorctl reread
    sudo supervisorctl update
    sudo supervisorctl start bgservice

Tip: Omgevingsvariabelen Configureren

Om omgevingsvariabelen voor je Python-script in Supervisor in te stellen, voeg de volgende regel toe aan je configuratiebestand:

environment=ENV_VAR1="value1",ENV_VAR2="value2"

Hierdoor kun je configuratie-opties doorgeven aan je script zonder de code te wijzigen.

systemd: Systeem- en Servicebeheerder

systemd is een systeem- en servicebeheerder voor Linux-besturingssystemen. Het beheert Python-scripts als systeemservices.

systemd gebruiken voor Python-scriptbeheer:

  1. Maak een servicebestand aan:

    sudo nano /etc/systemd/system/bgservice.service
  2. Voeg de volgende inhoud toe:

    [Unit]
    Description=Background Service Python Script
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/python3 /path/to/bgservice.py
    Restart=always
    User=yourusername
    
    [Install]
    WantedBy=multi-user.target
  3. Herlaad systemd, activeer en start de service:

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

Om je systemd-service te beheren:

  • Controleer status: sudo systemctl status bgservice.service
  • Stop service: sudo systemctl stop bgservice.service
  • Herstart service: sudo systemctl restart bgservice.service

Supervisor en systemd bieden oplossingen voor het beheren van langlopende Python-scripts. systemd is meer geïntegreerd in moderne Linux-systemen, terwijl Supervisor zich richt op procesbeheer.