Ich habe (noch) eine andere wait
, &
, &&
Kontrollfluss Frage ..
Angenommen, ich habe so etwas wie ein Skript, in dem ich so viel Arbeit wie möglich gleichzeitig erledigen möchte:
# may take some hours
something InputA > IrrelevantA &
something InputB > IrrelevantB &
# may take an hour
(
somethingElse InputA > OutputA &
somethingElse InputB > OutputB &
)&& combine OutputA OutputB > Result
...morestuff
Frage 1: combine
Warten Sie im Skript, bis beide somethingElse
Prozesse abgeschlossen sind, während beide something
Prozesse fortgesetzt werden?
Frage 2: Wenn nicht - und ich vermute es nicht - wie kann ich combine
nur auf beide somethingElse
Prozesse warten , während something
die oben genannten Prozesse im Hintergrund weiterarbeiten?
quelle
Würde Prozess Substitution effizienter sein, besonders wenn Sie nicht brauchen , um die Dateien zu speichern
OutputA
undOutputB
, und kümmern sich nur umResult
? Wäre dies besonders zeitsparend, da bei langsamen E / A-Vorgängen beim Schreiben auf die Festplatte die Dateien gespeichert werdenOutputA
undOutputB
möglicherweise die Geschwindigkeit begrenzt wird?Mit der Prozessersetzung können Sie den Befehl einfügen,
<(..here..)
anstatt die Ausgabe in einer Datei zu speichern und dann im Schritt "Kombinieren" als Eingabe daraus zu lesen.Wenn der Speicher eine Einschränkung darstellt und die Größe
outputA
undoutputB
mehr als das, was der Speicher aufnehmen kann, den gesamten Zweck zunichte macht?Wird
combine
warten , bis beide Prozesse abgeschlossen sind , bevor es zu laufen beginnt?quelle
combine
Wird ausgeführt, sobald die beidensomethingElse
Befehle gestartet wurden, aber das ist in Ordnung, da<(…)
es sich um Pipes handelt. Escombine
wird also einfach gezwungen sein, auf Daten zu warten, wenn diese diesomethingElse
Prozesse überholen . Und weil es sich um Rohre handelt, spielt die Größe keine Rolle. … (Fortsetzung)somethingElse
Prozesse zu testen - und es ist nicht ganz klar, ob dies für den Fragesteller wichtig ist. Eine Antwort sollte aber auch nicht darin bestehen, solche Fragen zu stellen.Sie können den folgenden
wait
Befehl verwenden:Sie können sehen, dass die "Start" -Zeile sofort passiert und das "Fertig" 10 Sekunden wartet.
quelle
Ich zeige tatsächlich genau, wie so etwas in einer anderen Antwort hier gemacht werden könnte . Diese Antwort bezog sich auf eine Frage, wie sichergestellt werden kann, dass 2 Protokolle von einem Hintergrundprozess verwaltet werden. Deshalb habe ich sie mit 10 demonstriert.
Demo-Skript
Führen Sie die Demo aus
Ausgabe:
Das Obige zeigt. Es baut und betreibt ein Skript mit dem Namen
/tmp/script
,chmod
ist es als ausführbare Datei, und führt es in dem&background
von ein&backgrounded ( subshell )
.Das Skript
rms /tmp/file0-9
10 Dateien undechoes
eine Zeile jede Sekunde in alle 10 von ihnen. Ich nehme einige$info
aus dem abgelehnten Prozess auf und präsentiere sie über$(command substitution). While ps
Standbildberichte zu dem von$pid
mir erfassten. Ich weiß, dass sie immer noch ausgeführt werden.sleep.
Wenn sie abgeschlossen sind, werden die Zeilen in allen 10 Dateien gezähltwc.
Nachdem Sie einen Prozess auf diese Weise aufgerufen haben, können Sie den ursprünglichen übergeordneten Prozess frei schließen und er wird weiter transportiert - er wird effektiv abgelehnt. Dies bedeutet auch, dass Sie den herkömmlichen
wait
Befehl nicht verwenden können , aber das Warten aufps
die Rückkehr sollte in jedem Fall robuster sein.Erwähnenswert ist meiner Meinung nach, dass der Prozess zunächst tatsächlich aufgerufen wird
$(command substitution)
undprintfs
ich das$info
möchte, damit ich ihn effektiv steuern kann. Aber sobald es seinen Terminalausgang mitexec 1>&2
(der in derselben Subshell mit geschlossen ist2>&-
) fallen lässt, entkommt der Prozess und ich muss am anderen Ende darauf warten. Ein bisschen das Beste aus beiden Welten, besonders wenn Sie es für die Handhabung von Eingangsleitungen verwenden, solange Sie sich um alle Umleitungen und Prozessleiter kümmern können.Alles andere dient hier nur zur Demonstration. Alles was Sie brauchen, um dies auszuführen, ist das Top-Skript und:
HINWEIS: Dies druckt nur genau das auf das Terminal, was ich demonstrieren wollte. Wie dies festgestellt wurde, wird
$PPID,
dieser Prozess vom Terminal abgelehnt und ist ein direktes Kind von$PID 1.
Wenn Sie zwei davon gleichzeitig
ps
ausführen und auf sie warten möchten, können Sie einfach beide Pids übergeben und warten.quelle