bash: roda o comando em segundo plano e captura o pid [duplicado]

16

Estou escrevendo um script bash 4.1 ...

  • Gostaria de executar outro script (ou função interna) em segundo plano ...
  • E capture o pid dessa tarefa em segundo plano em uma variável no script de primeiro plano ...
  • Se o trabalho não for iniciado, a variável deve receber um valor nulo (por exemplo, "").

Qualquer um desses trabalhos funciona se o trabalho de backround sempre começar ...

cmd &
VAR=$!

or...

( cmd & ); VAR=$!

Se cmd for executado, o pid do último comando iniciado ($!) será o desejado e o $ VAR estará correto.

No entanto, se cmd não for iniciado, $ VAR será o pid do último comando anterior iniciado, que pode ser o pid do primeiro plano script em si. Já que eu preciso do pid de cmd para o propósito de matar o processo sob certas condições mais tarde, possivelmente obter o pid errado simplesmente não funcionará.

O que eu realmente preciso é que o VAR só seja alterado se o trabalho em segundo plano for executado. Algo parecido com o sintaticamente incorreto ...

VAR=
( cmd & );  && VAR=$!

Solução implementada

Os comentários e a resposta de Joseph R foram muito úteis. Para o benefício de qualquer pessoa com um problema semelhante ...

A seguinte função bash executa o script GtkDialog standby no plano de fundo. Estar dentro de uma função, que é executada em um subprocesso, parece fornecer o isolamento necessário para evitar o PID do script de chamada em vez do PID do script standby se standby falhar ...

function standbyBg () {
  ifHelpShow "$1" 'standbyBg
    Run standby (busy "throbber") in background and echo its pid.
    Example:
        standbyPID=$(standbyBg)
    Revised:
        20131123 docsalvage'  && return
  #
  standby  >/dev/null 2>&1  &
  echo $!
}
    
por DocSalvager 11.09.2013 / 15:19

1 resposta

6

Um pouco de solução alternativa:

jobs &>/dev/null
cmd &
new_job_started="$(jobs -n)"
if [ -n "$new_job_started" ];then
    VAR=$!
else
    VAR=
fi

Graças ao comentário do @ terdon por direcionar minha atenção para help jobs .

    
por 11.09.2013 / 15:43