Ich brauche nohup
zwei 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 .sh
vorstellen 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.).
&&
anstatt;
dass der zweite Befehl nur ausgeführt wird, wenn der erste erfolgreich war (&&
ein bestimmter Bash-Befehl).Antworten:
Einfachste Lösung: Erstellen Sie ein Shell-Skript mit
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').
quelle
$()
sowieso eher Back-Ticks als Back-Ticks verwenden sollten. Aber dann wäre das identisch mit meiner Antwort.cd ; cd testdir; ls
return konnte den Befehl `testfile 'nicht ausführen ...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 &
quelle
&
Hintergründe der ganze Job.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 ...Vielleicht ein Bash Wrap?
quelle
Sie können verwenden
screen
, um die Befehle zu geben und sich von der Bildschirmsitzung zu trennen:Die Befehle werden wie bei nohup ausgeführt.
quelle