Quiero generar dos procesos secundarios, pero espere hasta que el primero alcance un cierto punto en su ejecución (que puede determinarse examinando stdout) antes de generar el segundo. No estoy seguro de qué comandos de Unix estarían involucrados en lograr esto, y he tenido dificultades para encontrar algo a través de Google debido a la naturaleza concisa ya veces críptica de los nombres de comandos de Unix.
No estoy buscando una solución para el problema específico que estoy tratando de resolver (aunque agradecería cualquier puntero adicional), me preocupa principalmente saber qué comandos de Unix me gustaría buscar y aprender a usar.
bash
bash-scripting
w.brian
fuente
fuente
Respuestas:
Puede usar la
xargs
utilidad para esto. Puede ejecutar un comando para cada línea en stdin, por lo que solo debemos asegurarnos de quexargs
obtenga como entrada una sola línea en stdin en el momento en que debe iniciar el comando, lo que se puede lograr congrep
:Los argumentos
--max-count=1
,--max-lines=1
y--no-run-if-empty
asegúrese de queproc2
se inicie exactamente una vez si y cuandoproc1
sale${targetString}
por primera vez, y nunca siproc1
nunca sale${targetString}
. El--replace
evita quexargs
agrega la línea de entrada a su línea de comando.Usé la siguiente línea de comando para probarlo:
fuente
No estoy seguro de que haya una orden / respuesta elegante a la pregunta que hizo (es decir, llegar a un cierto punto en su ejecución), pero hay herramientas / técnicas que se pueden utilizar para encontrar una solución, que probablemente implique más de 1 de lo siguiente, y quizás otras cosas que aún no conozco:
Escribir y verificar archivos de bloqueo también es una práctica común (consejo profesional: si tiene control del entorno, escriba en el disco RAM en lugar de / tmp, en muchas distribuciones esto es / dev / shm).
fuente
Esto es solo una idea, pero haga que el primer proceso canalice su salida a grep. Haga que grep canalice su salida a un bucle de línea de lectura y compare cada línea con lo que está buscando. Una vez encontrado, ejecute proc2.
Si se puede determinar "cierto punto en su ejecución"stdout
, entonces, ¿qué tal lo siguiente?proc1 | grep "stdout trigger string" && proc2
&&
debería disparar cuandogrep
regrese0
, lo que solo hace cuando encuentra una coincidencia.fuente
proc2 &
y entoncesbreak
, eso no sucedería, pero eso cerraría la tubería y haría que el proceso terminara prematuramente. Alternativamente, puede establecer un indicador una vez que se inicie proc2 y usarlo para asegurarse de que proc2 no se ejecute nuevamente. Al igual que con la otra respuesta, el resto de la salida proc1 se descarta, por lo que si lo necesita, se necesita más trabajo.|
ygrep
aquí).