Eu quero gerar dois processos filhos, mas aguarde até que o primeiro atinja um certo ponto em sua execução (que pode ser determinado pelo exame de stdout) antes de gerar o segundo. Não tenho certeza de quais comandos unix estariam envolvidos nessa tarefa e tive dificuldade em encontrar algo via google devido à natureza concisa e às vezes enigmática dos nomes de comando unix.
Não estou procurando uma solução para o problema específico que estou tentando resolver (embora qualquer ponteiro adicional seja apreciado), estou principalmente preocupado em saber quais comandos unix eu gostaria de procurar e aprender a usar.
bash
bash-scripting
w.brian
fonte
fonte
Respostas:
Você pode usar o
xargs
utilitário para isso. Ele pode executar um comando para cada linha no stdin, portanto, apenas precisamos garantir quexargs
receba como entrada uma única linha no stdin no momento em que deve iniciar o comando, o que pode ser realizado comgrep
:Os argumentos
--max-count=1
,--max-lines=1
e--no-run-if-empty
garantir queproc2
é iniciado exatamente uma vez, se e quandoproc1
saídas${targetString}
, pela primeira vez, e nunca seproc1
nunca saídas${targetString}
. Os--replace
evita quexargs
acrescenta o linha de entrada para sua linha de comando.Eu usei a seguinte linha de comando para testá-lo:
fonte
Não tenho certeza de que exista um comando / resposta elegante para a pergunta que você fez (por exemplo, alcance um certo ponto em sua execução) - mas existem ferramentas / técnicas que podem ser usadas para apresentar uma solução, provavelmente envolvendo mais de 1 o seguinte, e talvez outras coisas que ainda não sei:
Escrever e verificar arquivos de bloqueio também é uma prática comum (dica profissional - se você tiver controle do ambiente, escreva no ramdisk em vez de / tmp - em muitas distros, isso é / dev / shm).
fonte
Isso é apenas uma idéia, mas faça com que o primeiro processo canalize sua saída para grep. Faça com que o grep envie sua saída para um loop de linha de leitura e compare cada linha com o que você está procurando. Uma vez encontrado, execute proc2.
Se "um certo ponto de sua execução" pode ser determinado porstdout
, e quanto a seguir?proc1 | grep "stdout trigger string" && proc2
&&
deve disparar quandogrep
retorna0
, o que ocorre somente quando encontra uma correspondência.fonte
proc2 &
issobreak
, isso não aconteceria, mas fecharia o canal e faria com que proc1 terminasse prematuramente. Como alternativa, você pode definir um sinalizador assim que o proc2 for iniciado e usá-lo para garantir que o proc2 não seja executado novamente. Como na outra resposta, o restante da saída proc1 é descartado; portanto, se você precisar, mais trabalho será necessário.|
egrep
aqui).