Wie führt man ein Python-Skript im Hintergrund nach dem SSH-Logout aus?

Veröffentlicht 17. Oktober 2024

Problem: Ausführung von Python-Skripten nach Beenden einer SSH-Sitzung

Python-Skripte auf einem entfernten Server können stoppen, wenn die SSH-Verbindung geschlossen wird. Dies verhindert, dass lang laufende Skripte ihre Aufgaben beenden. Es wird eine Möglichkeit benötigt, Python-Skripte im Hintergrund weiterlaufen zu lassen, nachdem man sich von einer SSH-Sitzung abgemeldet hat.

Lösung: Verwendung des nohup-Befehls

Was ist nohup?

Der nohup-Befehl, kurz für "no hangup", ist ein Tool, das Prozesse auch nach dem Abmelden von einer Shell weiter ausführen lässt. Es verhindert, dass das System ein Hangup-Signal (SIGHUP) an den laufenden Prozess sendet, wenn das Terminal geschlossen wird. Dieses Signal beendet normalerweise Prozesse, die mit dem geschlossenen Terminal verbunden sind.

Anwendung von nohup mit Python-Skripten

So verwenden Sie nohup mit Ihrem Python-Skript:

  1. Öffnen Sie Ihr Terminal oder Ihre SSH-Sitzung.
  2. Wechseln Sie in das Verzeichnis mit Ihrem Python-Skript.
  3. Führen Sie diesen Befehl aus:

    nohup python bgservice.py &

Das Kaufmanns-Und (&) am Ende des Befehls weist das System an, den Prozess im Hintergrund auszuführen. So können Sie das Terminal für andere Aufgaben nutzen, während Ihr Skript läuft.

Tipp: Laufende Prozesse überprüfen

Um zu prüfen, ob Ihr nohup-Prozess läuft, verwenden Sie den 'ps'-Befehl:

ps aux | grep python

Dies zeigt alle laufenden Python-Prozesse an, einschließlich Ihres nohup-Befehls.

Ausgabesteuerung mit nohup

Standardmäßig sendet nohup die Ausgabe des Befehls an eine Datei namens "nohup.out" im aktuellen Verzeichnis. Wenn Sie eine benutzerdefinierte Ausgabedatei verwenden möchten, können Sie den Befehl wie folgt ändern:

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

Dieser Befehl leitet sowohl die Standardausgabe als auch Fehlerausgaben in die Datei "benutzerdefinierte_ausgabe.log" um.

Alternative Methoden zur Hintergrundausführung

Screen: Ein Terminal-Multiplexer

Screen ist ein Terminal-Multiplexer, der es ermöglicht, mehrere Terminal-Sitzungen in einem Fenster zu betreiben. Es hilft, Prozesse auch nach dem Trennen einer SSH-Sitzung weiterlaufen zu lassen.

So verwenden Sie Screen mit Ihrem Python-Skript:

  1. Starten Sie eine neue Screen-Sitzung:

    screen -S mein_python_skript
  2. Führen Sie Ihr Python-Skript aus:

    python bgservice.py
  3. Lösen Sie sich von der Screen-Sitzung, indem Sie Strg+A und dann D drücken.

Um sich später wieder mit der Sitzung zu verbinden, verwenden Sie:

screen -r mein_python_skript

Tipp: Verwaltung mehrerer Screen-Sitzungen

Um mehrere Screen-Sitzungen zu verwalten, verwenden Sie den Befehl screen -ls, um alle aktiven Sitzungen aufzulisten. Dies ermöglicht Ihnen, zu sehen, welche Sitzungen laufen und wie sie heißen, was den Wechsel zwischen verschiedenen Hintergrundprozessen erleichtert.

Tmux: Eine Alternative zum Terminal-Multiplexer

Tmux ist ein weiterer Terminal-Multiplexer ähnlich wie Screen. Er bietet mehr Funktionen und gilt oft als benutzerfreundlicher.

So verwenden Sie Tmux mit Ihrem Python-Skript:

  1. Starten Sie eine neue Tmux-Sitzung:

    tmux new -s mein_python_skript
  2. Führen Sie Ihr Python-Skript aus:

    python bgservice.py
  3. Lösen Sie sich von der Tmux-Sitzung, indem Sie Strg+B und dann D drücken.

Um sich später wieder mit der Sitzung zu verbinden, verwenden Sie:

tmux attach -t mein_python_skript

Im Vergleich zu Screen bietet Tmux:

  • Besseres Fenster-Management
  • Mehr Anpassungsmöglichkeiten
  • Einfachere Einrichtung der Statusleiste

Sowohl Screen als auch Tmux eignen sich gut, um Python-Skripte im Hintergrund laufen zu lassen. Die Wahl zwischen beiden hängt oft von persönlichen Vorlieben ab.

Prozessmanagement-Tools

Supervisor: Ein Prozesskontrollsystem

Supervisor ist ein Prozesskontrollsystem für Unix-ähnliche Betriebssysteme. Es verwaltet lang laufende Python-Skripte. Supervisor startet, stoppt und überwacht Prozesse und kann sie bei Abstürzen neu starten.

Vorteile der Verwendung von Supervisor für Python-Skripte:

  • Automatischer Neustart bei Abstürzen
  • Prozessverwaltung über Weboberfläche oder Kommandozeile
  • Protokollierung der Prozessausgabe
  • Gruppierung von Prozessen zur Verwaltung

Grundlegende Einrichtung und Konfiguration für Supervisor:

  1. Installieren Sie Supervisor:

    sudo apt-get install supervisor
  2. Erstellen Sie eine Konfigurationsdatei für Ihr Python-Skript:

    sudo nano /etc/supervisor/conf.d/bgservice.conf
  3. Fügen Sie folgenden Inhalt zur Datei hinzu:

    [program:bgservice]
    command=python /pfad/zu/bgservice.py
    directory=/pfad/zum/skript/verzeichnis
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/bgservice.err.log
    stdout_logfile=/var/log/bgservice.out.log
  4. Laden Sie Supervisor neu und starten Sie Ihr Programm:

    sudo supervisorctl reread
    sudo supervisorctl update
    sudo supervisorctl start bgservice

Tipp: Konfiguration von Umgebungsvariablen

Um Umgebungsvariablen für Ihr Python-Skript in Supervisor zu setzen, fügen Sie folgende Zeile zu Ihrer Konfigurationsdatei hinzu:

environment=ENV_VAR1="wert1",ENV_VAR2="wert2"

Dies ermöglicht es Ihnen, Konfigurationsoptionen an Ihr Skript zu übergeben, ohne den Code zu ändern.

systemd: System- und Service-Manager

systemd ist ein System- und Service-Manager für Linux-Betriebssysteme. Es verwaltet Python-Skripte als Systemdienste.

Verwendung von systemd zur Verwaltung von Python-Skripten:

  1. Erstellen Sie eine Service-Datei:

    sudo nano /etc/systemd/system/bgservice.service
  2. Fügen Sie folgenden Inhalt hinzu:

    [Unit]
    Description=Hintergrund-Service Python-Skript
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/python3 /pfad/zu/bgservice.py
    Restart=always
    User=ihrBenutzername
    
    [Install]
    WantedBy=multi-user.target
  3. Laden Sie systemd neu, aktivieren und starten Sie den Dienst:

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

So verwalten Sie Ihren systemd-Dienst:

  • Status überprüfen: sudo systemctl status bgservice.service
  • Dienst stoppen: sudo systemctl stop bgservice.service
  • Dienst neu starten: sudo systemctl restart bgservice.service

Supervisor und systemd bieten Lösungen zur Verwaltung lang laufender Python-Skripte. systemd ist stärker in moderne Linux-Systeme integriert, während Supervisor sich auf Prozessverwaltung konzentriert.