Я хочу порождать два дочерних процесса, но подождите, пока первый не достигнет определенной точки своего выполнения (которую можно определить, изучив stdout), прежде чем порождать второй. Я не уверен, какие Unix-команды будут задействованы для достижения этой цели, и им было трудно найти что-либо через Google из-за краткой, а иногда и загадочной природы имен Unix-команд.
Я не ищу решения конкретной проблемы, которую пытаюсь решить (хотя любые дополнительные указатели были бы оценены), я в первую очередь беспокоюсь о том, какие команды Unix я бы хотел найти и научиться использовать.
bash
bash-scripting
w.brian
источник
источник
Ответы:
Вы можете использовать
xargs
утилиту для этого. Он может запускать команду для каждой строки в stdin, поэтому нам просто нужно убедиться, чтоxargs
получает в качестве входных данных одну строку в stdin во время запуска команды, что может быть выполнено с помощьюgrep
:Аргументы
--max-count=1
,--max-lines=1
и--no-run-if-empty
убедитесь, чтоproc2
запускается ровно один раз, если и когдаproc1
выводит${targetString}
в первый раз, и никогда, еслиproc1
никогда не выводит${targetString}
. В--replace
избегает , чтоxargs
добавляет строку ввода в его командной строке.Я использовал следующую командную строку, чтобы проверить это:
источник
Я не уверен, что есть изящная команда / ответ на вопрос, который вы задали (т. Е. Достичь определенной точки в его выполнении), - но есть инструменты / методы, которые можно использовать, чтобы найти решение, возможно, включающее более 1 следующее, а может и другие вещи, о которых я пока не знаю:
Написание и проверка файлов блокировки также является обычной практикой (совет: если у вас есть контроль над средой, пишите на виртуальный диск, а не в / tmp - во многих дистрибутивах это / dev / shm).
источник
Это всего лишь идея, но первый процесс должен передать свой вывод в grep. Пусть grep направит свой вывод в цикл чтения строки и сравнит каждую строку с тем, что вы ищете. Найдя, выполните proc2.
Если «определенная точка в его исполнении» может быть определенаstdout
, то как насчет следующего?proc1 | grep "stdout trigger string" && proc2
&&
должен срабатывать приgrep
возврате0
, что он делает только тогда, когда находит совпадение.источник
proc2 &
и тоbreak
, что бы не случилось, но что бы закрыть трубу и сделать proc1 прекращается досрочно. В качестве альтернативы, вы можете установить флаг после запуска proc2 и использовать его, чтобы убедиться, что proc2 больше не запускается. Как и в случае с другим ответом, остальные выходные данные proc1 отбрасываются, поэтому, если вам это нужно, требуется больше работы.|
иgrep
здесь).