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?

zihaoyu
quelle

Antworten:

213

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.

Edward Dale
quelle
15
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)

Cooper
quelle
17

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.

Dirk Eddelbuettel
quelle
12

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.

Dustin Kirkland
quelle
Eine kurze Erklärung zu geben, wie das Problem gelöst werden kann, ist im Allgemeinen eine gute Idee.
Nikhil Sahu
7

Sie können es nicht tun, aber ich bevorzuge Bildschirm .

Randy Proctor
quelle
5

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.pyDatei anstelle von ersetzen my_func.

Chouettou
quelle
1
Möglicherweise muss das SIGHUP-Signal abgefangen werden. Fügen Sie dann signal.signal (signal.SIGHUP, Handler) in Ihren Block ein.
Chouettou
3

Die zsh- Shell bietet die Option, alle Hintergrundprozesse mit nohup auszuführen.

In ~/.zshrcfü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.

jonescb
quelle
1

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

Nikhil Sahu
quelle
1

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')
Victor Mendonça Nogueira
quelle
0

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 .

Sushil Verma
quelle