Aguardar processo terminar em ShellScript

Fonte da imagem: http://buddylindsey.com

Para explicar melhor o que quero dizer com "Aguardar processo terminar", irei fazer a seguinte suposição, você iniciou um download usando o wget porém após isso você lembrou que precisa fazer download de outro arquivo e pretende fazer download desse arquivo após termino do primeiro do download, se você tivesse pensado nisso antes você poderia fazer:
wget http://example.org/file1.zip; wget http://example.org/file2.zip
Como não pensou, o que você faz ? Cancela e inicia como no exemplo acima ? Não!
Você pode utilizar uma simples função em ShellScript que aguarde determinado processo termine usando seu PID e então execute o comando determinado, um curto exemplo:

Aguardar Processo terminar (ZSH)
function waitend() {
if [ $# -lt 2 ]; then
echo "Usage: waitend PID COMMAND [COMMAND arguments]"
return 2
fi
while (true) {
RUNNING=$(ps aux | grep $1 | grep -v "grep" | wc -l)
if [ $RUNNING -eq 0 ]; then
$2 ${@:3}
break
else
sleep 1
fi
}
}
Essa é uma pequena função escrita em ZSH (exemplo em bash no final do post), uma breve explicação:

  1. Checamos se a função foi chamada com o número correto de argumentos (>=2) (Linhas 2-5)

  2. Se a função foi chamado com o número correto de argumentos em entramos em um loop while (Linhas 6-14)

  3. Então checamos se tem algum processo com determinado PID ($1) se não tivermos nenhum processo com determinado PID então rodamos determinado comando ($2 - ...), caso contrário aguardamos um segundo e então o loop while é repetido.
A linha em destaque (7) você pode modificar para usar o pgrep-wc porém é mais recomendado que use ps-grep-wc pois provavelmente toda distribuição GNU/Linux tem, enquanto o pgrep não.

Agora você pode modificá-la para ficar ao seu agrado ou fazer o que quiser com ela...
Se você pretende somente usá-la pra fins semelhantes a minha suposição você pode apenas colocá-la no seu ~/.zshrc ou ~/.bashrc e então:


ps aux | grep 'wget'
# pegar o PID do wget, segunda coluna
waitend <PID_do_Processo> wget http://example.org/file2.zip


A mesma função escrita em bash (Poucas diferenças)

Aguardar Processo terminar (Bash)
function waitend() {
if [ $# -lt 2 ]; then
echo "Usage: waitend PID COMMAND [COMMAND arguments]"
return 2
fi
while (true)
do
RUNNING=$(ps aux | grep $1 | grep -v "grep" | wc -l)
if [ $RUNNING -eq 0 ]; then
$2 ${@:3}
break
else
sleep 1
fi
done
}

Tutorial feito por Victor Aurélio S. 

Compartilhe no:

Dono do blog e Autor.
Possui conhecimento em diversos assuntos e atualmente se dedica ao blog para ensinar coisas e dar soluções através dos problemas que ele mesmo se depara em seu desktop e na Web.

Nenhum Comentário em "Aguardar processo terminar em ShellScript"

Postar um comentário

Eu espero que voce...

1. Comente com moderação.
2. Sugira ou Opine.
3. Divulgue.