Quais regras governam o relacionamento pai-filho de processos iniciados pelo shell em um pipe?

1
#!/bin/ksh
# start_service: start the service
my_server_executable 2>&1 | my_pipe_following_shell_script &
exit 0

Depois de executar o script start_service acima na linha de comando, é observado usando o comando ps que o processo bash executando my_pipe_following_shell_script é pai de my_server_executable , enquanto seria de esperar, e precisa , o último a ser propriedade do PID 1 ( init ) em vez disso.

Estou à procura de uma explicação sobre por que isso aconteceu e como posso evitar isso .

Além disso, como se faz a depuração / análise do que acontece nos bastidores? A execução de start_service com strace não é muito útil. A única linha interessante que encontrei na saída é:

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f05708) = 30431

em que 30431 é PID de my_pipe_following_shell_script .

Linux 2.6.18-308.16.1.el5PAE

versão ksh (AT & T Research) 93t + 2010-02-02

GNU bash, versão 3.2.25 (1) -release (i686-redhat-linux-gnu)

    
por rabindra 20.03.2013 / 04:23

1 resposta

1

Seu shell - ksh neste caso - é o pai dos processos nos ambos lados do pipe, porque ele iniciou os dois. Tudo o que faz entre iniciar um e o outro é configurar o canal entre eles, para que o stdout do primeiro vai para o stdin do segundo.

Se você precisar que a aglomeração de dois processos seja executada em segundo plano, isso será feito:

( my_server_executable 2>&1 | my_pipe_following_shell_script ) &

Isso inicia os dois programas - conectados por meio de um canal - dentro de um subshell , que é colocado em o fundo via & .

    
por 20.03.2013 / 05:28