O processo em segundo plano gerado pela Shell ainda está pendurado [fechado]

0

Parece que os processos gerados após || fazem o shell pai travar com eles. Por exemplo, faça no seu terminal

$ cat <<"EOF" >/tmp/hello_im_still_here
#!/usr/bin/env bash
killall emacsclient
pgrep emacsclient || emacsclient -c &
EOF
$ chmod +x /tmp/hello_im_still_here
$ ./tmp/hello_im_still_here

e confira

$ pstree | grep emacsc
     |-hello_im_still_---emacsclient

Alterando a linha de bifurcação do processo para

pgrep emacsclient || (nohup emacsclient -c) &

não ajuda.

    
por tijagi 20.01.2014 / 16:21

1 resposta

1

Em bash e a maioria dos shells, ao contrário de zsh ,

cmd1 || cmd2 &

é como:

{ cmd1 || cmd2; } &

Então é esse subshell executando cmd1 || cmd2 que é iniciado em segundo plano.

bash não otimiza executando cmd2 no processo subshell, e é por isso que você vê dois processos: o processo bash e cmd2 . O processo bash está aguardando apenas que cmd2 termine. Observe que o shell de chamada não está bloqueado. O único "problema" é esse processo de subconsumo desnecessário extra e o fato de que cmd1 também é executado em segundo plano.

Uso:

cmd1 || { cmd2 &}

Ou mais legivelmente:

if ! cmd1; then
  cmd2 &
fi

Se você quiser que apenas cmd2 seja executado em segundo plano.

    
por 20.01.2014 / 18:35

Tags