Chcę odrodzić dwa procesy potomne, ale przed odrodzeniem drugiego poczekaj, aż pierwszy osiągnie określony punkt w jego wykonaniu (który można ustalić, badając standardowe wyjście). Nie jestem pewien, które komendy uniksowe byłyby zaangażowane w osiągnięcie tego, i miałem trudności ze znalezieniem czegokolwiek za pośrednictwem google ze względu na zwięzłą, a czasem tajemniczą naturę nazw komend unix.
Nie szukam rozwiązania konkretnego problemu, który próbuję rozwiązać (chociaż dodatkowe wskaźniki byłyby mile widziane), przede wszystkim martwię się o to, które polecenia unixowe chciałbym wyszukać i nauczyć się używać.
bash
bash-scripting
w.brian
źródło
źródło
Odpowiedzi:
Możesz do tego użyć
xargs
narzędzia. Może uruchomić polecenie dla każdego wiersza na standardowymxargs
wejściu , więc musimy tylko upewnić się, że pobiera on jako wejście pojedynczy wiersz na standardowym wejściu w czasie, gdy powinien uruchomić polecenie, co można osiągnąć za pomocągrep
:Argumenty
--max-count=1
,--max-lines=1
i--no-run-if-empty
zapewniają, żeproc2
rozpoczyna się dokładnie raz, czy i kiedyproc1
wyjść${targetString}
po raz pierwszy, i nigdy, jeśliproc1
nigdy nie stosowały wyjść${targetString}
. W--replace
Unika żexargs
Dołącza linię wejściową do swojej linii komend.Użyłem następującego wiersza polecenia, aby go przetestować:
źródło
Nie jestem pewien, czy istnieje eleganckie polecenie / odpowiedź na zadane pytanie (tj. Osiągnięcie określonego punktu w jego wykonaniu) - ale istnieją narzędzia / techniki, których można użyć do rozwiązania problemu, prawdopodobnie obejmującego więcej niż 1 następujące, a może inne rzeczy, o których jeszcze nie wiem:
Pisanie i sprawdzanie plików blokujących jest również powszechną praktyką (wskazówka - jeśli masz kontrolę nad środowiskiem, pisz na ramdysku zamiast / tmp - w wielu dystrybucjach jest to / dev / shm).
źródło
To tylko pomysł, ale pierwszy proces potokowy powinien wyprowadzać dane wyjściowe do grep. Niech grep potoczy wyjście do pętli linii odczytu i porównaj każdą linię z tym, czego szukasz. Po znalezieniu uruchom proc2.
Jeśli „określony punkt w jego wykonaniu” może zostać określonystdout
, to co z tego?proc1 | grep "stdout trigger string" && proc2
&&
powinien strzelać pogrep
powrocie0
, co robi tylko wtedy, gdy znajdzie dopasowanie.źródło
proc2 &
, a następniebreak
, że nie stało, ale to by zamknąć przewód i dokonać PROC1 zakończyć przedwcześnie. Alternatywnie, możesz ustawić flagę po uruchomieniu proc2 i użyć jej, aby upewnić się, że proc2 nie uruchomi się ponownie. Podobnie jak w przypadku innej odpowiedzi, reszta danych wyjściowych proc1 jest odrzucana, więc jeśli jej potrzebujesz, potrzeba więcej pracy.|
igrep
tutaj).