Ausführen mehrerer Nohup-Befehle im Hintergrund


11

Habe zwei Befehle cmd1 und cmd2. Von den beiden dauert die Fertigstellung von cmd2 länger. Müssen cmd2 und dann cmd1 ausführen.

Versucht, sie auf folgende Weise auszuführen:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

oder

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

Aber beide Male, wenn ich sehe, wartet cmd1 nicht darauf, dass cmd2 fertig ist und result1 gefüllt wird.

Wie kann man cmd1 nach cmd2 laufen lassen, wenn beide Nohup-Prozesse sein und im Hintergrund ausgeführt werden sollen?


Diese Frage wird bereits gestellt unix.stackexchange.com/questions/67006/…
Rahul Patil

2
Die Frage in unix.stackexchange.com/questions/67006/… ist etwas anders, da ich meine Ausführungsreihenfolge beibehalten wollte. Bitte korrigieren Sie mich, wenn ich die andere Frage falsch verstehe.
user33767

Antworten:


12

Du hast beides gemacht cmd1und bist cmd2parallel gelaufen. Sie sagten: „Starten Sie cmd2 im Hintergrund und trennen Sie alle Verknüpfungen damit. Starten Sie cmd1 im Hintergrund und trennen Sie alle Verknüpfungen damit. “ Sie meinten: „Starten Sie cmd2 im Hintergrund; Wenn es fertig ist, starte cmd1 (auch im Hintergrund). “ Da mit der Hintergrundaufgabe keine Zuordnung mehr besteht, müssen Sie eine Hintergrundaufgabe erstellen, die cmd2 und dann cmd1 ausführt. Dies ist cmd2; cmd1(oder besser gesagt cmd2 && cmd1, um cmd1 nur auszuführen, wenn cmd2 erfolgreich ist), und Sie müssen angeben, dass nohupdafür eine Shell gestartet werden soll, die im Hintergrund ausgeführt wird.

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &

Vielen Dank. Es funktioniert gut. Ja, das habe ich mir gedacht, nachdem der erste Befehl in den Hintergrund gestellt wurde, hat dies keinen Einfluss auf den zweiten Befehl, der gestartet wird, obwohl ich wollte, dass er auf den Abschluss des ersten Befehls wartet. Ich muss das Handbuch zum Senden von Befehlen an den Hintergrund lesen.
user33767

3

Wenn es Ihnen nichts ausmacht, nohup nicht zu verwenden:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown

Werde das überprüfen. Aber derzeit wird mit Antwort von Giles gehen, wo der Befehl mit sh umbrochen wird.
Trotzdem

Das ist eine schlechte Idee. Wenn sich der Benutzer von der Konsole abmeldet, wird die Sitzung beendet.
Mootmoot

@mootmoot dies funktioniert wie beabsichtigt, überprüfen Sie dies selbst; Befehle erhalten kein SIGHUP, wenn die übergeordnete Shell beendet wird.
Artyom

Ja, es ist Shell-sicher, wenn Sie den Befehl mit crond / crontab ausführen. Aber es ist nicht pty / xterm / ssh sicher. unix.stackexchange.com/questions/3886/…
mootmoot

2

Verwenden Sie einfach:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &

Während das Ausführen des Mehrfachbefehls in Ordnung ist, wollte ich die genaue Ausführungsreihenfolge beibehalten, dh zuerst cmd2 und dann cmd1, und dies geschieht nicht mit dem obigen Befehl. danke
user33767

0

Lassen Sie uns wissen, was genau Sie mit cmd2 und cmd1 machen. Dies hängt von der Art der Aufgabe und der Ausgabe ab, die Sie von Ihrem Befehl erwarten. Wenn Sie Probleme haben, zweimal die Eingabetaste mit dem Befehl zu drücken, kann dies in meinem Beitrag herausgefunden werden

Sie können auch auf diesem Weg gehen

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

Siehe den unten angegebenen Screenshot. Hier verwende ich 3 Befehle und alle werden einzeln nacheinander ausgeführt. Ich habe Backticks für diese Aufgabe verwendet. Im Screenshot können Sie auch den Datums- und Zeitstempel beobachten. Der Befehl sleep hat 60 Sekunden, daher wird mein nächster Befehl nach 60 Sekunden erfolgreich ausgeführt. Ich habe den Befehl jobs verwendet, um zu überprüfen, ob ein Befehl noch im Hintergrund ausgeführt wird. Hier nicht. von Jobs, die Sie sehen können, ist 1.

nohup-multiple-befehl

Dieser Screenshot ist auch unter diesem Link verfügbar , wenn er nicht sichtbar ist

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.