Führen Sie hintergrund-Prozess in Python und NICHT warten
Mein Ziel ist einfach: kick-off rsync und NICHT WARTEN.
Python 2.7.9 auf Debian
Beispielcode:
rsync_cmd = "/usr/bin/rsync -a -e 'ssh -i /home/myuser/.ssh/id_rsa' {0}@{1}:'{2}' {3}".format(remote_user, remote_server, file1, file1)
rsync_cmd2 = "/usr/bin/rsync -a -e 'ssh -i /home/myuser/.ssh/id_rsa' {0}@{1}:'{2}' {3} &".format(remote_user, remote_server, file1, file1)
rsync_path = "/usr/bin/rsync"
rsync_args = shlex.split("-a -e 'ssh -i /home/mysuser/.ssh/id_rsa' {0}@{1}:'{2}' {3}".format(remote_user, remote_server, file1, file1))
#subprocess.call(rsync_cmd, shell=True) # This isn't supposed to work but I tried it
#subprocess.Popen(rsync_cmd, shell=True) # This is supposed to be the solution but not for me
#subprocess.Popen(rsync_cmd2, shell=True) # Adding my own shell "&" to background it, still fails
#subprocess.Popen(rsync_cmd, shell=True, stdin=None, stdout=None, stderr=None, close_fds=True) # This doesn't work
#subprocess.Popen(shlex.split(rsync_cmd)) # This doesn't work
#os.execv(rsync_path, rsync_args) # This doesn't work
#os.spawnv(os.P_NOWAIT, rsync_path, rsync_args) # This doesn't work
#os.system(rsync_cmd2) # This doesn't work
print "DONE"
(Hab ich auskommentiert, die Ausführung der Befehle nur, weil ich bin eigentlich halten alle meine Prüfungen in meinem code, so dass ich weiß, was ich getan habe und was ich nicht getan habe. Natürlich, ich würde führen Sie das Skript mit den richtigen Zeile auskommentiert.)
Was passiert ist diese...ich beobachten kann, die übertragung auf den server und wenn es fertig ist, bekomme ich dann "FERTIG" gedruckt auf dem Bildschirm.
Was mir geschehen ist "FERTIG" sofort gedruckt nach der Ausgabe des rsync
Befehl und für die übertragung zu starten.
Scheint sehr straight-forward. Ich habe gefolgt angegebenen details in anderen Beiträgen, wie diese ein und diese, aber etwas verhindert, für mich zu arbeiten.
Dank im Voraus.
(Ich habe alles versucht ich finden kann, StackExchange und sich nicht, wie dies ist ein Duplikat, weil ich immer noch nicht bekommen kann es arbeiten. Etwas nicht stimmt in meinem setup-und Hilfe benötigen.)
Zeiger ist Ihre beste Wette.
eins sagt "creationflags" ist nur für Windows. Der link, den Sie geliefert, spricht über Win32 zu.
Haben Sie versucht, vereinfachen Sie Ihren code, um zu sehen, wo das problem wirklich ist?
subprocess.call("sleep 10".split())
hat eine offensichtliche Verzögerung in den code in der Erwägung, dass subprocess.Popen("sleep 10".split())
geht zur nächsten Zeile sofort. Vielleicht ist Ihr problem ist irgendwo anders und schwer zu sehen? Hat Ihr code-Arbeit (in Bezug auf Timing), wenn Sie geändert haben den rsync-Aufruf einen einfachen sleep-Aufruf?unrelated: es ist nutzlos zu erwähnen, "NICHTS für mich", es sei denn, Sie zeigen die genauen code-Beispiel, das scheitert, zu beschreiben, was hast du erwartet, es zu tun, und was passiert stattdessen Schritt für Schritt durch.
InformationsquelleAutor harperville | 2016-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist verifiziert Beispiel für Python-REPL:
Wie stellen Sie sicher, dass Sie sich über ein weiteres terminal-Fenster:
Ausgabe:
Process()
wie empfohlen von @Esau vor.Ich druckte eine Meldung in das Protokoll nach dem Aufruf von Popen, wie Ihr Beispiel zeigt, und ich sah meine Meldung in die log. Das Problem ist woanders, ich habe noch zu finden, aber wie üblich, dein Vorschlag hat mir geholfen, festzustellen, Popen war nicht das Problem. Vielen Dank für die Hilfe! Ich bin mit
p = subprocess(rsync_dict, close_fds=True)
ist es funktioniert wie beworben.Ich fühle mich wie der Grund des Verhaltens ist in Ihrem Befehl, die wahrscheinlich wartet auf eine Eingabe von
stdin
.verwenden stdout=DEVNULL statt stdout=PIPE, sonst wird der Kind-Prozess zum Stillstand, wenn die OS-pipe-Puffer gefüllt.
können Sie erklären, warum Ihre Antwort funktioniert?
InformationsquelleAutor Viach Kakovskyi
Popen()
startet einen untergeordneten Prozess, es wartet nicht, bis es zu beenden. Sie müssen rufen Sie.wait()
Methode explizit, wenn Sie wollen, warten Sie, bis der Kind-Prozess. In diesem Sinne, alle Teilprozesse sind Prozesse im hintergrund.Auf der anderen Seite, wird der Kind-Prozess Erben können verschiedene Eigenschaften/Ressourcen der Eltern, wie offene Datei-Deskriptoren, die Prozess-Gruppe, die sich seiner Kontrolle terminal, einige signal-Konfiguration, etc—es kann dazu führen, zu verhindern Vorfahren Prozesse zu beenden z.B., Python-subprocess .check_call vs .check_output oder das Kind kann sterben vorzeitig auf Ctrl-C (SIGINT-signal an den vordergrundprozess Gruppe) oder wenn der terminal-session wird geschlossen (SIGHUP).
Zu distanzieren, wird der Kind-Prozess vollständig ist, sollten Sie es eine daemon. Manchmal etwas dazwischen, das könnte genügen, z.B. ist es genug, um leiten Sie die geerbt stdout in ein Enkelkind, so dass
.kommunizieren()
in der Eltern zurückkehren würde, wenn seine unmittelbar untergeordneten beendet.natürlich, Beispiel
InformationsquelleAutor jfs