Wie führe ich ein Python-Skript im Hintergrund aus, auch nachdem ich mich bei SSH abgemeldet habe?
110
Ich habe ein Python-Skript bgservice.pyund möchte, dass es die ganze Zeit ausgeführt wird, da es Teil des von mir erstellten Webdienstes ist. Wie kann ich es auch nach dem Abmelden von SSH kontinuierlich ausführen?
Wenn ich den Befehl mit nohup und & nohup: ignoring in put and appending output to ausführe , erhalte ich die Nachricht nohup.out'` und wenn ich die Eingabetaste drücke, wird der Prozess mit Status 1 beendet. Was ist los?
Santosh Ghimire
1
Lesen Sie die Ausgabe in nohup.out. In meinem Fall war es ein Berechtigungsproblem, ich musste sudo
mxns
und wie kann man den bgservice stoppen, nachdem er in dieser Methode ausgeführt wurde?
Feuer im Loch
1
@Shaegorath speichere die PID irgendwo, damit du später Signale an den Prozess senden kannst. In einigen Shells (Bash, Zsh usw.) somecommand &wird die PID nach dem Drucken wie folgt gedruckt [1] 12345. sonst kannst du verwenden $!.
Tony Beta Lambda
31
Wenn Sie den Prozess bereits gestartet haben und ihn nicht beenden und unter nohup neu starten möchten, können Sie ihn in den Hintergrund senden und dann ablehnen.
Ctrl+Z (Unterbrechen Sie den Prozess)
bg (Starten Sie den Prozess im Hintergrund neu
disown %1(Angenommen, dies ist Job Nr. 1, verwenden Sie jobszur Bestimmung)
Sie können Ihr Python-Skript in einen richtigen Python-Daemon verwandeln, wie hier beschrieben .
python-daemon ist ein gutes Tool, mit dem Python-Skripte als Hintergrund-Daemon-Prozess und nicht als ewig laufendes Skript ausgeführt werden können. Sie müssen den vorhandenen Code ein wenig ändern, aber es ist schlicht und einfach.
Wenn Sie Probleme mit Python-Daemon haben, gibt es einen anderen Dienstprogramm- Supervisor , der dasselbe für Sie erledigt. In diesem Fall müssen Sie jedoch keinen Code schreiben (oder vorhandenen Code ändern), da dies eine sofort einsatzbereite Lösung für die Dämonisierung ist Prozesse.
Hier ist eine einfache Lösung in Python mit einem Dekorateur:
import os, timedef daemon(func):def wrapper(*args,**kwargs):if os.fork():return
func(*args,**kwargs)
os._exit(os.EX_OK)return wrapper@daemondef 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 Ihrer bgservice.pyDatei anstelle von ersetzen my_func.
Wenn Sie möchten, dass der Prozess für immer ausgeführt wird, unabhängig davon, ob Sie angemeldet sind oder nicht, sollten Sie den Prozess als Daemon ausführen.
Supervisord ist eine großartige Out-of-the-Box-Lösung, mit der jeder Prozess dämonisiert werden kann. 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 Skripte ändern, damit dies funktioniert. Darüber hinaus vereinfacht eine ausführliche Dokumentation diesen Vorgang erheblich.
Nachdem ich mir stundenlang am Python-Daemon den Kopf gekratzt habe, ist Supervisor die Lösung, die in wenigen Minuten für mich funktioniert hat.
Ich hoffe, dies hilft jemandem, der versucht, Python-Daemon zum Laufen zu bringen
import yapdi
daemon = yapdi.Daemon()
retcode = daemon.daemonize()# This would run in daemon mode; output is not visibleif retcode == yapdi.OPERATION_SUCCESSFUL:print('Hello Daemon')
nohup: ignoring in put and appending output to
ausführe , erhalte ich die Nachricht nohup.out'` und wenn ich die Eingabetaste drücke, wird der Prozess mit Status 1 beendet. Was ist los?somecommand &
wird die PID nach dem Drucken wie folgt gedruckt[1] 12345
. sonst kannst du verwenden$!
.Wenn Sie den Prozess bereits gestartet haben und ihn nicht beenden und unter nohup neu starten möchten, können Sie ihn in den Hintergrund senden und dann ablehnen.
Ctrl+Z
(Unterbrechen Sie den Prozess)bg
(Starten Sie den Prozess im Hintergrund neudisown %1
(Angenommen, dies ist Job Nr. 1, verwenden Siejobs
zur Bestimmung)quelle
Sie können auch einen GNU-Bildschirm verwenden, den nahezu jedes Linux / Unix-System haben sollte.
Wenn Sie auf Ubuntu / Debian sind, ist die erweiterte Variante byobu auch ziemlich nett.
quelle
Sie können Ihr Python-Skript in einen richtigen Python-Daemon verwandeln, wie hier beschrieben .
python-daemon ist ein gutes Tool, mit dem Python-Skripte als Hintergrund-Daemon-Prozess und nicht als ewig laufendes Skript ausgeführt werden können. Sie müssen den vorhandenen Code ein wenig ändern, aber es ist schlicht und einfach.
Wenn Sie Probleme mit Python-Daemon haben, gibt es einen anderen Dienstprogramm- Supervisor , der dasselbe für Sie erledigt. In diesem Fall müssen Sie jedoch keinen Code schreiben (oder vorhandenen Code ändern), da dies eine sofort einsatzbereite Lösung für die Dämonisierung ist Prozesse.
quelle
Sie können es nicht tun, aber ich bevorzuge Bildschirm .
quelle
Hier ist eine einfache Lösung in Python mit einem Dekorateur:
Sie können natürlich den Inhalt Ihrer
bgservice.py
Datei anstelle von ersetzenmy_func
.quelle
Die zsh- Shell bietet die Option, alle Hintergrundprozesse mit nohup auszuführen.
In
~/.zshrc
fügen Sie die Zeilen:Dann müssen Sie nur noch einen Prozess wie
python bgservice.py &
folgt ausführen: und Sie müssen den Befehl nohup nicht mehr verwenden.Ich weiß, dass nicht viele Leute zsh verwenden, aber es ist eine wirklich coole Shell, die ich empfehlen würde.
quelle
Wenn Sie möchten, dass der Prozess für immer ausgeführt wird, unabhängig davon, ob Sie angemeldet sind oder nicht, sollten Sie den Prozess als Daemon ausführen.
Supervisord ist eine großartige Out-of-the-Box-Lösung, mit der jeder Prozess dämonisiert werden kann. 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 Skripte ändern, damit dies funktioniert. Darüber hinaus vereinfacht eine ausführliche Dokumentation diesen Vorgang erheblich.
Nachdem ich mir stundenlang am Python-Daemon den Kopf gekratzt habe, ist Supervisor die Lösung, die in wenigen Minuten für mich funktioniert hat.
Ich hoffe, dies hilft jemandem, der versucht, Python-Daemon zum Laufen zu bringen
quelle
Sie können auch Yapdi verwenden :
Grundlegende Verwendung:
quelle
Versuche dies:
Sie können den obigen Befehl auf dem Bildschirm ausführen und den Bildschirm verlassen.
Sie können Protokolle Ihres Python-Skripts nicht folgendermaßen verfolgen:
tail -f <your log file>.log
Um Ihr Skript zu beenden, können Sie die Befehle ps aux und kill verwenden .
quelle