Antworten:
Ausführen nohup python bgservice.py &
, damit das Skript das Auflegesignal ignoriert und weiter ausgeführt wird. Die Ausgabe wird eingegeben nohup.out
.
Idealerweise würden Sie Ihr Skript mit so etwas ausführen supervise
, damit es neu gestartet werden kann, wenn (wann) es stirbt.
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 neu
disown %1
(Angenommen, dies ist Job Nr. 1, verwenden Sie jobs
zur Bestimmung)
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.
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.
Sie können es nicht tun, 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 Ihrer bgservice.py
Datei anstelle von ersetzen my_func
.
Die zsh- Shell bietet die Option, alle Hintergrundprozesse mit nohup auszuführen.
In ~/.zshrc
fügen Sie die Zeilen:
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 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.
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
Sie können auch Yapdi verwenden :
Grundlegende 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')
Versuche dies:
nohup python -u <your file name>.py >> <your log file>.log &
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 .
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?