Ich möchte zwei untergeordnete Prozesse erzeugen, aber warten Sie, bis der erste einen bestimmten Punkt in seiner Ausführung erreicht (der durch Untersuchen von stdout bestimmt werden kann), bevor Sie den zweiten erzeugen. Ich bin mir nicht sicher, welche Unix-Befehle dazu beitragen würden, und es fiel mir schwer, über Google etwas zu finden, da Unix-Befehlsnamen knapp und manchmal kryptisch sind.
Ich suche keine Lösung für das spezifische Problem, das ich zu lösen versuche (obwohl zusätzliche Hinweise erwünscht wären). Ich möchte in erster Linie wissen, welche Unix-Befehle ich nachschlagen und deren Verwendung lernen möchte.
bash
bash-scripting
w.brian
quelle
quelle
Antworten:
Sie können das
xargs
Dienstprogramm dafür verwenden. Es kann einen Befehl für jede Zeile in stdin ausführen, daher müssen wir nur sicherstellen, dassxargs
zum Zeitpunkt des Starts des Befehls eine einzelne Zeile in stdin als Eingabe abgerufen wird. Dies kann ausgeführt werden mitgrep
:Die Argumente
--max-count=1
,--max-lines=1
und stellen Sie--no-run-if-empty
sicher, dassproc2
genau einmal gestartet wird, wenn und wann zum ersten Malproc1
ausgegeben${targetString}
wird, und nie, wennproc1
nie ausgegeben wird${targetString}
. Das--replace
vermeidet, dassxargs
die Eingabezeile an ihre Befehlszeile angehängt wird.Ich habe die folgende Befehlszeile verwendet, um es zu testen:
quelle
Ich bin mir nicht sicher, ob es einen eleganten Befehl / eine elegante Antwort auf die von Ihnen gestellte Frage gibt (dh einen bestimmten Punkt in der Ausführung erreichen) - aber es gibt Tools / Techniken, mit denen eine Lösung gefunden werden kann, an der wahrscheinlich mehr als eine beteiligt ist Folgendes und vielleicht andere Dinge, von denen ich noch nichts weiß:
Das Schreiben und Überprüfen von Sperrdateien ist ebenfalls gängige Praxis (Tipp: Wenn Sie die Kontrolle über die Umgebung haben, schreiben Sie auf die Ramdisk anstatt auf / tmp - in vielen Distributionen ist dies / dev / shm).
quelle
Dies ist nur eine Idee, aber der erste Prozess leitet seine Ausgabe an grep weiter. Lassen Sie die Ausgabe von grep an eine gelesene Zeilenschleife weiterleiten und vergleichen Sie jede Zeile mit dem, was Sie suchen. Sobald gefunden, führen Sie proc2 aus.
Wenn "ein bestimmter Punkt in seiner Ausführung" durch bestimmt werden kannstdout
, wie wäre es dann mit dem Folgenden?proc1 | grep "stdout trigger string" && proc2
&&
sollte bei dergrep
Rückkehr ausgelöst werden0
, was nur dann der Fall ist, wenn eine Übereinstimmung gefunden wird.quelle
proc2 &
und dannbreak
wäre das nicht passieren, aber das würde das Rohr und macht proc1 vorzeitig beenden schließen. Alternativ können Sie nach dem Start von proc2 ein Flag setzen und damit sicherstellen, dass proc2 nicht erneut ausgeführt wird. Wie bei der anderen Antwort wird der Rest der proc1-Ausgabe verworfen. Wenn Sie ihn benötigen, ist mehr Arbeit erforderlich.|
undgrep
hier) demonstriert .