nohup mehrere aufeinanderfolgende Befehle

7

Ich brauche nohupzwei Befehle nacheinander. Der zweite Befehl muss NACH dem ersten Befehl ausgeführt werden. Hier sind die Befehle:

tar -zcf archive.tar.gz.tmp mydir
mv archive.tar.gz.tmp archive.tar.gz

Ich brauche die Befehle, um im Hintergrund ausgeführt zu werden, aber offensichtlich nicht beide gleichzeitig. Der zweite Befehl muss ausgeführt werden, nachdem der erste Befehl abgeschlossen ist. Ich habe es versucht:

nohup tar -zcf archive.tar.gz.tmp mydir ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1 &

Die Befehle werden jedoch nicht im Hintergrund ausgeführt. Die Bash-Eingabeaufforderung wartet, bis die beiden Befehle abgeschlossen sind, bevor sie mir eine weitere Eingabeaufforderung gibt. Ich brauche sie, um im Hintergrund zu laufen.

Wenn ich mache:

nohup tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 &

Das läuft perfekt im Hintergrund. Es ist nur, wenn ich versuche, mehr als einen Befehl auszuführen.

Ich habe auch versucht:

nohup tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 & ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1 &

Aber das hat auch nicht funktioniert. Ungültige Syntax oder so. Ich bin mir sicher, dass es einen Weg gibt, dies zu tun, aber ich bin mir der Syntax einfach nicht sicher.

Die einzige Alternative, die ich mir .shvorstellen kann, besteht darin, die Befehle in eine Datei zu schreiben und diese Datei nicht zu aktualisieren, aber das kann ich nicht unbedingt auf dem Linux-System tun, auf dem ich dies implementieren muss (Berechtigungsbeschränkungen usw.).

Jake Wilson
quelle
Ich weiß, das ist eine alte Frage. Unabhängig von der gewählten Nohup-Lösung sollten Sie Ihre beiden Befehle mit verbinden, &&anstatt ;dass der zweite Befehl nur ausgeführt wird, wenn der erste erfolgreich war ( &&ein bestimmter Bash-Befehl).
Martin Hennings

Antworten:

4

Einfachste Lösung: Erstellen Sie ein Shell-Skript mit

 #/bin/sh
 tar -zcf archive.tar.gz.tmp mydir
 mv archive.tar.gz.tmp archive.tar.gz

Und verwenden nohup myscript. Möglicherweise mit zusätzlicher Dokumentation im Skript.

(Ja, ich bin ein Trottel für Dokumentation. Besonders wenn Sie mit mehreren Personen arbeiten oder wenn Sie eines Tages den Job verlassen und Ihr Nachfolger herausfinden muss, warum ".)


Eine Alternative könnte darin bestehen, eine neue Shell für eine Unteraufgabe zu starten (in diesem Fall Ihren Teer und Ihre Bewegung).

nohup `$ (tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz)


Alternative 2:

nohup `` `tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz```.

Ich bevorzuge das Drehbuch wirklich. Die darin enthaltenen Kommentare können sehr nützlich sein, wenn Sie oder jemand anderes sich das Skript in ein paar Jahren ansehen und sich fragen, warum es so gemacht wurde.

In einem anderen Zusammenhang: Wie zum Teufel poste ich einen Anser mit einem Backtick? (Der Befehl für eine Shell, 'diesen Befehl zu verwenden; die Ausgabe einem anderen Befehl als Eingabe zuzuführen').

Hennes
quelle
Nun, gute Praxis schreibt vor, dass Sie $()sowieso eher Back-Ticks als Back-Ticks verwenden sollten. Aber dann wäre das identisch mit meiner Antwort.
Aaron Copley
Tatsächlich versuchen Backticks, das Ergebnis des Ausdrucks im Inneren auszuwerten. Abhängig von den Befehlen funktioniert dies möglicherweise nicht.
Michael
Alternative 2 scheint nicht zu funktionieren: mkdir testdir touch testdir / testfile dann run nohup cd ; cd testdir; lsreturn konnte den Befehl `testfile 'nicht ausführen ...
"Beistand" bedeutet eine dringend benötigte Hilfe, z. B. jemanden zu trösten, der verzweifelt ist und hier nicht ganz angemessen erscheint. Möglicherweise meinten Sie den allgemeinen englischen Ausdruck "Ich bin ein Trottel für X".
Jonathan Hartley
3

Ich denke, Sie brauchen Klammern.

nohup $(tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz) >/dev/null 2>&1 &

Aaron Copley
quelle
Es wartet noch, bis beide Befehle abgeschlossen sind, bevor es zur Eingabeaufforderung zurückkehrt.
Jake Wilson
Was ist die Schale? Ich bekomme sofort eine Aufforderung in Bash. Letzte &Hintergründe der ganze Job.
Aaron Copley
Drücke Enter. Sie erhalten eine Eingabeaufforderung.
Aaron Copley
Ah ja okay, es läuft korrekt in der Bash-Shell. Ich habe versucht, es über den PHP- exec()Befehl auszuführen, aber es wartet darauf, dass der zweite Befehl ausgeführt wird. Seltsamerweise verhält es sich, wenn ich nur einen Befehl mache, wie erwartet ...
Jake Wilson
@ Jakobud: Das Beispiel von nohup php exec () befindet sich im PHP-Handbuch php.net/manual/en/function.exec.php und verweist auf stackoverflow.com/questions/3748432/…
user9517
2

Vielleicht ein Bash Wrap?

nohup bash -c 'tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1' &
ghm1014
quelle
0

Sie können verwenden screen, um die Befehle zu geben und sich von der Bildschirmsitzung zu trennen:

screen
tar -zcf archive.tar.gz.tmp mydir && mv archive.tar.gz.tmp archive.tar.gz
ctrl-a d to detach

Die Befehle werden wie bei nohup ausgeführt.

Laurent
quelle
Bildschirm -dmS wäre dann besser.
3molo
Vielleicht, aber ich denke, es ist einfacher zu verstehen, Dinge getrennt zu zeigen: Bildschirm öffnen, Befehle geben und trennen als alles in derselben Zeile, der Sitzung einen Namen geben müssen.
Laurent
Der Bildschirm eignet sich hervorragend für die interaktive Verwendung, ist jedoch nicht für die Skripterstellung oder Automatisierung geeignet.
Jonathan Hartley