Controle de jobs nos scripts em Bash

controle_jobs-2_abertura

No final do controle de jobs do Bash citei de dois comandos que fazem parte do controle de jobs do Bash mas que agem dentro dos scripts, não dei maiores detalhes mas prometi falar deles em outra oportunidade. São o suspend (que pausa a execução da shell) e o wait (que faz a shell aguardar o término de sub processos antes de prosseguir com a execução).

E, sim, esta é a “outra oportunidade”! 🙂

Parada forçada

A primeiro dos comandos é o suspend e sua função (como o nome já sugere) é pausar a execução da shell corrente até que um SIGCONT seja sinalizado. Um exemplo bem simples:

O comando “set -m” habilita o controle de jobs dentro desta sessão e sem ele o suspend não funcionará corretamente.

E ao executá-lo…

$ ./suspend.sh 
suspende a execução do script.
[2]+  Parado                  ./suspend.sh
$ jobs
[1]-  Parado                  vim suspend.sh
[2]+  Parado                  ./suspend.sh
$ fg %2
./suspend.sh
retorna a execução do script.

O programa escreverá a primeira linha na tela, suspenderá a execução e ficará neste estado até que o comando fg restabeleça sua execução .

Esperando o término

O outro comando é o wait que aguarda o término de um determinado sub processo — identificado através do JOB_SPEC — ou se ninguém for identificado de todos os sub processos dentro daquela shell.

Um exemplo não tão simples agora…

Este programa apenas executa o comando sleep (mas poderia ser qualquer outra tarefa que se possa paralelizar) e aceita dois parâmetros, o “seq” que executa cada tarefa em sequência e “par” que coloca todas as tarefas em execução de uma vez em segundo plano.

Apenas como referência esta é a execução da forma sequencial:

$ time ./wait.sh seq
iniciando a contagem...
<início 1>  <início 2>  <início 3>  <início 4>
  <início 5> 

todos os processos terminaram.
real 0m25.013s
user 0m0.004s
sys 0m0.000s

E esta a execução em paralelo:

$ time ./wait.sh par
iniciando a contagem...
<início 1> <início 2> <início 3>

*** esperando o término dos processos. ***
<início 4> <início 5>      
todos os processos terminaram.
real 0m5.007s
user 0m0.004s
sys 0m0.000s

As mensagens ficam meio bagunçadas na tela mas o importante é que a última delas só acontece quanto todos os processos se finalizam — remova/comente o comando wait do programa e veja o que acontecerá.

Concluindo

Claro, o exemplo é bobo mas invés de um simples comando sleep poderia ser a execução de diversos procedimentos de transferência de arquivo via cp, rsync, scp ou wget coletando arquivos de diversos lugares antes de consolidá-los em um único tarball, por exemplo. O mesmo no caso do suspend onde antes que a execução seja suspensa algum tipo de alerta pode ser enviado — por exemplo, um e-mail.

E isto encerra a parte de controle de jobs do próprio Bash e lembrando que isto é só uma parte do gerenciamento de processos em GNU/Linux ou um outro “sabor” de UNIX…  🙂

Anúncios

2 comentários sobre “Controle de jobs nos scripts em Bash

  1. Onde estão os conteúdos dos scripts suspend.sh e wait.sh?

    Sugestão: faz um tempo que tenho dado a extensão .bash, no lugar de .sh, para os scripts que são dependentes de bash, aconselho a fazer o mesmo, mas não sei se é o caso.

    Curtir

    • Acredito que seu navegador esteja bloqueando os Gists do GitHub. Veja no código fonte das páginas e você encontrará algo assim:

      «p»«script src=”https://gist.github.com/plainspooky/{hash do gist}.js”»«/script»«/p»

      E quanto ao uso de “sh” ou “bash” como sufixo, uso “sh” por pura inércia mas dependendo do caso até omito. Já pensou escrever gunzip.sh a todo momento? 🙂

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s