Befehl, der in nohup ausgeführt wird, wird beendet, sobald das Kittterminal geschlossen wird

1428
Sughosh

Ich habe eine Amazon Ubuntu EC2-Instanz

Ich verwende PuTTY, um auf das gleiche zuzugreifen.

Hier habe ich eine große Datenbank in MySQL. Ich führe den folgenden Befehl aus, um die Sicherung meiner Datenbank zu erstellen.

nohup mysqldump -u Benutzername -ppassword meinendatenbank | gzip> mydatabase.sql.gz

Wenn ich jetzt PuTTY verlasse, wird der Befehl nicht mehr im Hintergrund ausgeführt.

Ich habe auch versucht mit & zu laufen

dh nohup mysqldump -u Benutzername -ppassword mydatabase | gzip> mydatabase.sql.gz &

Alle diese Tage hat es gut funktioniert. Aber plötzlich verhält es sich merkwürdig.

Kann mir jemand helfen?

1
Schreiben Sie alles außer "nohup" und "&" in ein Skript und rufen Sie das Skript mit "nohup" und "&" auf. Möglicherweise wird gzip beendet, wenn Sie den Putty schließen. Wenn der vollständige Befehl im Skript fehlschlägt, lassen Sie es mich wissen. mnmnc vor 9 Jahren 0

1 Antwort auf die Frage

2
zackse

Die Argumente, nohupdie vor dem Pipe-Symbol beendet werden sollen, da die Shell Metachars wie |und >vor dem Aufruf des Befehls interpretiert .

Die bereitgestellte Befehlszeile leitet die Standardausgabe von nohup (nicht mysqldump) an die Standardeingabe von gzip. Wenn Sie sich abmelden, erhalten Ihre Shell und alle untergeordneten Prozesse ein Hangup-Signal. nohupverhindert, dass das Signal den mysqldumpBefehl erreicht, der gzipBefehl wird jedoch abgebrochen, da er immer noch an das steuernde Terminal angeschlossen ist, das beim Beenden der Sitzung geschlossen wird.


Sie können Ihren Befehl in ein Skript einfügen, wie von mnmnc vorgeschlagen, oder eine neue Shell aufrufen, um die gesamte Pipeline auszuführen:

nohup sh -c 'mysqldump -u user -ppass db | gzip > db.sql.gz' &

Hier nohupwird ein einzelner Befehl aufgerufen sh. Beachten Sie, dass die Standardausgabe standardmäßig an die Datei nohup.outgesendet wird. Wir erwarten jedoch keine Ausgabe von diesem Befehl, da die Standardausgabe von umgeleitet wird mysqldump.

Die neu erzeugte Shell ruft die Befehlspipeline auf mysqldump | gzipund leitet die Standardausgabe gzipin die angegebene Datei um.

Hier können Sie den Unterschied in den aufgerufenen Befehlen sehen (using ddstatt mysqldumpfür diese Beispiele):

$ nohup dd if=/dev/urandom bs=1M count=50 | gzip > /tmp/out.gz & [1] 10721 nohup: ignoring input and redirecting stderr to stdout  $ jobs [1] 10720 Running nohup dd if=/dev/urandom bs=1M count=50 10721 | gzip > /tmp/out.gz & 

vs

$ nohup sh -c 'dd if=/dev/urandom bs=1M count=50 | gzip > /tmp/out.gz' & [1] 10792 nohup: ignoring input and appending output to ‘nohup.out’  $ jobs [1] 10792 Running nohup sh -c 'dd if=/dev/urandom bs=1M count=50 | gzip > /tmp/out.gz' & 
Vielen Dank Zack. Das Shell-Scripting funktioniert. Jede Idee, warum mein Script (ohne das Hinzufügen von Shell) früher funktionierte, schlägt plötzlich aus. Trotzdem vielen Dank für Ihre Lösung :) Sughosh vor 9 Jahren 0
Eine Möglichkeit ist, dass die Datenbank im Laufe der Zeit wächst und zuerst der `mysqldump | Die gzip-Pipeline wurde beendet, bevor Sie die Shell verlassen haben. Später lief der Befehl beim Beenden immer noch, was dazu führte, dass "gzip" beendet wurde und "mysqldump" ein "SIGPIPE" erhielt. zackse vor 9 Jahren 0