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?
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.
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)
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.
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.
Sie können es Nohup, aber ich bevorzuge Bildschirm .
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
.
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.
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
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')