8

Я хочу порождать два дочерних процесса, но подождите, пока первый не достигнет определенной точки своего выполнения (которую можно определить, изучив stdout), прежде чем порождать второй. Я не уверен, какие Unix-команды будут задействованы для выполнения этого, и ему было трудно найти что-либо через Google из-за краткой, а иногда и загадочной природы имен Unix-команд.

Я не ищу решение конкретной проблемы, которую пытаюсь решить (хотя любые дополнительные указатели были бы признательны), я в первую очередь беспокоюсь о том, какие команды Unix я бы хотел найти и научиться использовать.

3 ответа3

7

Вы можете использовать утилиту xargs для этого. Он может запускать команду для каждой строки в stdin, поэтому нам просто нужно убедиться, что xargs получает в качестве входных данных одну строку в stdin во время запуска команды, что может быть выполнено с помощью grep:

proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2

Аргументы --max-count=1 , --max-lines=1 и --no-run-if-empty гарантируют, что proc2 запускается ровно один раз, если и когда proc1 выдает ${targetString} впервые, и никогда если proc1 никогда не выводит ${targetString} . --replace позволяет избежать, что xargs добавляет строку ввода к своей командной строке.

Я использовал следующую командную строку, чтобы проверить это:

(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"
7

Я не уверен, что есть элегантная команда / ответ на заданный вами вопрос (т. Е. Достичь определенной точки в его выполнении), но есть инструменты / методы, которые можно использовать для нахождения решения, возможно, включающего более 1 следующее, а может и другие вещи, о которых я пока не знаю:

  1. Фоновые процессы (&)
  2. Условное исполнение (&& и ||)
  3. спать
  4. подождите (я ожидаю, что это будет особенно полезно - если вы запустите более 1 задания в фоновом режиме, он будет ждать, пока все задания не будут завершены)
  5. Именованные каналы (которые могли бы обеспечить механизм общения между процессами).
  6. inodenotifywait

Запись и проверка файлов блокировки также является обычной практикой (совет: если у вас есть контроль над средой, пишите на виртуальный диск, а не в /tmp - во многих дистрибутивах это /dev /shm).

6

Это всего лишь идея, но первый процесс должен передать свой вывод в grep. Пусть grep передаст свой вывод в цикл чтения строки и сравнит каждую строку с тем, что вы ищете. Найдя, выполните proc2.

#!/bin/bash
targetString="line you are looking for"
proc1 | grep "${targetString}" |
while read line
do
if [ "$line" = "${targetString}" ]; then
    proc2
fi
done

Если с помощью stdout можно определить "определенную точку его выполнения", то как насчет следующего?

proc1 | grep "stdout trigger string" && proc2

&& должен запускаться, когда grep возвращает 0 , что он делает только тогда, когда находит совпадение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .