Quais comandos eu usaria para criar dois processos filhos em série?

8

Eu quero gerar dois processos filhos, mas aguarde até que o primeiro alcance 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 em realizar isso, e tive dificuldades em encontrar algo através do google devido à natureza concisa e às vezes enigmática dos nomes de comandos unix.

Não estou procurando uma solução para o problema específico que estou tentando resolver (embora quaisquer indicadores adicionais sejam bem-vindos), estou preocupado principalmente em saber quais comandos unix eu gostaria de pesquisar e aprender a usar.

    
por w.brian 17.02.2018 / 05:05

3 respostas

7

Você pode usar o utilitário xargs para isso. Ele pode executar um comando para cada linha no stdin, portanto, precisamos garantir que xargs receba como entrada uma única linha no stdin no momento em que deve iniciar o comando, o que pode ser realizado com grep :

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

Os argumentos --max-count=1 , --max-lines=1 e --no-run-if-empty garantem que proc2 seja iniciado exatamente uma vez se e quando proc1 produzir ${targetString} pela primeira vez e nunca se proc1 nunca produzir ${targetString} . O --replace evita que xargs acrescente a linha de entrada à sua linha de comando.

Eu usei a seguinte linha de comando para testá-lo:

(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"
    
por 17.02.2018 / 15:16
7

Não tenho certeza se existe um comando / resposta elegante para a pergunta que você fez (ou seja, atingir um certo ponto em sua execução) - mas existem ferramentas / técnicas que podem ser usadas para evitar uma solução, provavelmente envolvendo mais de um dos seguintes, e talvez outras coisas que ainda não conheço:

  1. Processos de plano de fundo (&)
  2. Execução condicional (& & e ||)
  3. dormir
  4. aguarde (espero que isso seja particularmente útil - se você iniciar mais de um trabalho em segundo plano, ele aguardará até que todos os trabalhos sejam concluídos)
  5. Canais nomeados (que podem fornecer um mecanismo para falar entre processos).
  6. inodenotifywait

Escrever e checar arquivos de travas também é uma prática comum (pro tip - se você tem controle sobre o ambiente, escreva para o ramdisk em vez de / tmp - em muitas distros, isso é / dev / shm).

    
por 17.02.2018 / 05:35
6

Esta é apenas uma idéia, mas o primeiro processo canaliza sua saída para o grep. Faça o grep canalizar 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.

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

Se "um certo ponto em sua execução" pode ser determinado por stdout , então que tal o seguinte?

proc1 | grep "stdout trigger string" && proc2

&& deve disparar quando grep devolve 0 , o que apenas acontece quando encontra uma correspondência.

    
por 17.02.2018 / 06:00