wake-up-neo.com

Wie führe ich ein Python im Hintergrund aus, auch nachdem ich SSH abgemeldet habe?

Ich habe Python script bgservice.py und ich möchte, dass es die ganze Zeit ausgeführt wird, da es Teil des von mir erstellten Webdienstes ist. Wie kann ich sicherstellen, dass es auch nach dem Abmelden von SSH kontinuierlich ausgeführt wird?

101
zihaoyu

Lauf Nohup python bgservice.py &, damit das Skript das Aufhängesignal ignoriert und weiterläuft. Die Ausgabe erfolgt in Nohup.out.

Idealerweise würden Sie Ihr Skript mit so etwas wie supervise ausführen, damit es neu gestartet werden kann, wenn (wann) es stirbt.

191
Edward Dale

Wenn Sie den Prozess bereits gestartet haben und ihn nicht abbrechen und unter Nohup neu starten möchten, können Sie ihn in den Hintergrund verschieben und dann nicht mehr anzeigen.

Ctrl+Z (Vorgang unterbrechen)

bg (starte den Prozess im Hintergrund neu

disown %1 (vorausgesetzt dies ist Job # 1, verwenden Sie jobs, um zu bestimmen)

27
Cooper

Sie können auch GNU-Bildschirm verwenden, das so ziemlich jedes Linux/Unix-System haben sollte.

Wenn Sie auf Ubuntu/Debian sind, ist die erweiterte Variante byob auch ziemlich nett.

16

Sie können Ihr python Skript in einen richtigen python Daemon verwandeln, wie beschrieben hier .

python-daemon ist ein gutes Tool, mit dem Sie python Skripts als Hintergrund-Daemon-Prozess ausführen können, anstatt ein ständig laufendes Skript. Sie müssen vorhandenen Code ändern ein bisschen aber es ist schlicht und einfach.

Wenn Sie mit Python-Daemon auf Probleme stoßen, gibt es ein anderes Hilfsprogramm Supervisor , das das Gleiche für Sie erledigt. In diesem Fall müssen Sie jedoch keinen Code schreiben (oder vorhandenen Code ändern), da es sich um einen handelt Out-of-the-Box-Lösung zur Dämonisierung von Prozessen.

10
Dustin Kirkland

Sie können es Nohup, aber ich bevorzuge Bildschirm .

6
Randy Proctor

Hier ist eine einfache Lösung in python mit einem Dekorateur:

import os, time

def daemon(func):
    def wrapper(*args, **kwargs):
        if os.fork(): return
        func(*args, **kwargs)
        os._exit(os.EX_OK)
    return wrapper

@daemon
def my_func(count=10):    
  for i in range(0,count):
     print('parent pid: %d' % os.getppid())
     time.sleep(1)


my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own

Sie können natürlich den Inhalt Ihres bgservice.py Datei anstelle von my_func.

5
Chouettou

Die zsh Shell hat die Option, alle Hintergrundprozesse mit Nohup laufen zu lassen.

Im ~/.zshrc füge die Zeilen hinzu:

setopt nocheckjobs  #don't warn about bg processes on exit
setopt Nohup        #don't kill bg processes on exit

Dann müssen Sie nur noch einen Prozess wie folgt ausführen: python bgservice.py &, und Sie müssen den Befehl Nohup nicht mehr verwenden.

Ich weiß, dass nicht viele Leute zsh benutzen, aber es ist eine wirklich coole Shell, die ich empfehlen würde.

3
jonescb

Wenn der Prozess für immer ausgeführt werden soll, unabhängig davon, ob Sie angemeldet sind oder nicht, sollten Sie ihn als Daemon ausführen.

supervisord ist eine sofort einsatzbereite Lösung, mit der Sie jeden Prozess dämonisieren können. Es verfügt über ein weiteres Steuerungsdienstprogramm supervisorctl, mit dem Prozesse überwacht werden können, die vom Supervisor ausgeführt werden.

Sie müssen keinen zusätzlichen Code schreiben oder vorhandene Skripts ändern, damit dies funktioniert. Darüber hinaus vereinfacht eine ausführliche Dokumentation diesen Vorgang erheblich.

Nachdem ich mich stundenlang mit Python-Daemon beschäftigt habe, ist Supervisor die Lösung, die für mich innerhalb von Minuten funktioniert hat.

Hoffe, dies hilft jemandem, der versucht, Python-Daemon zum Laufen zu bringen

1
Nikhil Sahu

Sie können auch Yapdi verwenden:

Grundsätzliche Verwendung:

import yapdi

daemon = yapdi.Daemon()
retcode = daemon.daemonize()

# This would run in daemon mode; output is not visible
if retcode == yapdi.OPERATION_SUCCESSFUL:
print('Hello Daemon')