Como passar o PID de um processo para outro processo dentro do mesmo script de shell?

1

Ok, essa pode ser uma pergunta muito tola e eu não escrevo scripts de shell com muita frequência. Eu estou tentando iniciar 3 processos em segundo plano, um após o outro dentro de um script de shell, por exemplo:

#!/bin/sh
PROCESS1 &
PROCESS2 &
PROCESS3 &

Aqui está o problema. Eu preciso iniciar esses processos na mesma ordem mostrada. Além disso, o PID do PROCESS2 precisa ser passado como o argumento da linha de comando para o PROCESS3. Todos esses processos são executados no loop infinito e funcionam bem quando executados em três terminais separados. Eu tentei:

#!/bin/sh
PROCESS1 &
PROCESS2 &
PID_PROCESS2=$!
PROCESS3 ${PID_PROCESS2} &

Isso inicia o PROCESS1 e o PROCESS3, mas o PROCESS2 sai imediatamente sem imprimir nenhum erro. Apenas desaparece. O comando ps não mostra vestígios de PROCESS2. Imprimir o PID_PROCESS2 fornece algum valor 'p' e o PROCESS3 é executado bem com o valor 'p' como seu argumento. Qual é o problema e onde estou faltando?

DETALHES PROVAVELMENTE IMPORTANTES

1) No exemplo acima, estou usando os caminhos qualificados para invocar os respectivos processos e todos eles são binários nativos e estão no mesmo diretório. Por exemplo,

#!/bin/sh
/usr/bin/PROCESS1 &

A saída de ps é como descrito acima,

$ps | grep "/path/to/PROCESS"
10064 root 16536 S /path/to/PROCESS1
10066 root 11084 S /path/to/PROCESS3 10065

que diz claramente que o PROCESS2 foi iniciado, mas saiu por algum motivo desconhecido.

2) O PROCESS2 se comunica com o PROCESS1 por meio de um FIFO (pipe nomeado) e é uma comunicação unidirecional.

WORKAROUND

#/bin/sh
/path/to/PROCESS1 &
/path/to/PROCESS2 & PROCESS2_PID=$!
export P2PID=${PROCESS2_PID}
sh -c "/path/to/PROCESS3 ${P2PID}"

Isto parece fazer o trabalho com um processo extra para sh.

$ps | grep "/path/to/PROCESS"
10174 root 16536 R /path/to/PROCESS1
10175 root 71720 S /path/to/PROCESS2
10177 root 27772 S sh -c /path/to/PROCESS3 10175
10076 root 11084 S /path/to/PROCESS3 100175

Mas ainda não faço ideia do porquê isso funciona. Alguém pode sugerir que tipo de "mágica" aconteceu neste caso?

    
por Prateek Gupta 12.08.2018 / 22:37

1 resposta

0

Com base no que você está descrevendo, parece que há algo fundamentalmente errado com o PROCESS2 que está causando a saída dele. Se eu modelar o que você está descrevendo com 3 processos, ele funcionará principalmente como seria de se esperar quando você fizer o background dos 3 processos e, em seguida, capturar e passar o PID do 2o processo para processar 3.

Exemplo

script de exemplo
$ cat runny.bash
#!/bin/bash

proc3func() {
  echo $1
  sleep 7 &
}

sleep 9 &
sleep 8 &
PID2=$!
proc3func ${PID2} &
exemplo executado
$ ./runny.bash ; sleep 2; ps -eaf
4279
UID        PID  PPID  C STIME TTY          TIME CMD
...
vagrant   4278     1  0 20:21 pts/1    00:00:00 sleep 9
vagrant   4279     1  0 20:21 pts/1    00:00:00 sleep 8
vagrant   4282     1  0 20:21 pts/1    00:00:00 sleep 7

Na saída acima, podemos ver o PID, 4279 sendo ecoado na tela, seguido pela saída de ps -eaf , que mostra nossos 3 processos.

Depuração

Sugiro ativar set -x para que você possa seguir os comandos que estão sendo executados ao executar o script ou executá-lo da seguinte forma:

$ bash -x ./runny.bash
+ PID2=4612
+ sleep 9
+ sleep 8
+ proc3func 4612
+ echo 4612
4612
+ sleep 7
    
por 13.08.2018 / 03:03