Como pesquisar corretamente a existência de um script de segundo plano

5

Eu tenho um problema com o seguinte tipo de script:

  #!/bin/sh

  long_running_script.sh &  

  while [ 'pidof long_running_script.sh' ]
  do
    echo "."
    sleep 1
  done

O sript iniciará um novo script para o segundo plano, e deverá imprimir pontos até que o script backgroud seja encerrado. Funciona quando a carga da CPU não é alta.

Mas, quando há alta carga de CPU, ela não funciona: o long_running_script.sh será iniciado, mas o script 'parent' sairá do loop while antes do long_running_script.sh sair.

Parece que pidof é executado antes que o long_running_script.sh seja realmente iniciado (execved).

Qual é a melhor maneira de resolver esse problema?

1 segundo de sono antes do comando while não ajudou. Então, não quero usar nenhum atraso mágico, porque pode não ser confiável.

    
por SKi 20.09.2012 / 12:50

3 respostas

4

pidof não encontrará scripts, uma vez que olha apenas para a primeira parte do nome do processo ( argv[0] ).

Você pode usar pidof -m , mas isso encontrará qualquer long_running_script.sh , não apenas aquele iniciado por este script.

A melhor maneira é usar a variável $! , que contém o PID do trabalho em segundo plano mais recente.

#!/bin/bash

long_running_script.sh &  
pid=$!

while ps -p $pid >/dev/null
do
    echo "."
    sleep 1
done
    
por 20.09.2012 / 17:25
2

Use wait :

#!/bin/sh
  long_running_script.sh &  
  wait
  echo "done"

Mais detalhes .

    
por 20.09.2012 / 13:03
2

No caso de você não querer um wait i de bloqueio, resolveria esse problema com o recurso de controle de trabalho embutido do bash. Para apenas um processo bifurcado e executado é realmente simples e minha abordagem se parece com isso

#!/bin/sh

sleep 1 &

while jobs | grep -q "Running" ; do
    echo -n "."     # no trailing newline
    sleep 0.1
done

echo 
    
por 20.09.2012 / 13:05