quinta-feira, 13 de maio de 2010

Envie sinais para seu Bash script

Você já deve estar acostumado com o famoso comando kill -9 que envia o sinal de KILL para certo processo ou o kill -HUP, que envia um sinal de HangUp e na maioria dos daemons faz com que ele recarregue seu arquivo de configuração.

Mas poucos sabem é que existem vários outros sinais, inclusive alguns livres para serem usados por você em algum propósito especial.

Veja o seguinte código:

#!/bin/bash
 
while true; do
    echo " Hello World again!"
    sleep 3
done


Trata-se de um loop infito que mostra uma mensagem a cada 3 segundos.
Podemos utilizar o comando trap para "interceptar" certos sinais enviados para o processo e executar algum comando quando ao receber o sinal.

Vamos então melhorar nosso script:

#!/bin/bash

trap "echo Saindo...; exit" INT

while true; do
    echo " Hello World again!"
    sleep 3
done


Ao rodar o script, pressione Ctrl-C para interromper o processo. A mensagem "Saindo..." será exibida antes do processo terminar. Isso aconteceu porque tratamos o sinal INT ( Interrupt ).

Outro exemplo interessante é utilizar o sinal USR1, ( User signal 1 ), que é um sinal que voce pode utilizar para qualquer coisa em seu script. Veja:


#!/bin/bash

trap "echo Saindo...; exit" INT
trap "echo Mensagem assincrona!" USR1

while true; do
    echo " Hello World again!"
    sleep 3
done


Rode o script e em outro terminal, ache o PID do seu script e envie o sinal USR1 para ele. Troque testetrap.sh pelo nome do arquivo de seu script.

P=`ps a | grep testetrap.sh | grep -v grep | cut -f2  -d\  `; kill -USR1 $P

Veja no outro terminal que a mensagem aparecerá de forma assíncrona. Pra que serve? Em shell script avançado voce pode tomar ações antes que seu script seja fechado ou implementar funções especiais, como fazer algum salvamento parcial.

Para aprender mais sobre sinais, sugiro a leitura do man kill e o site:  http://en.wikipedia.org/wiki/Kill_%28command%29

2 comentários:

  1. Muito legal essa informação. Procurando por shell script em geral, passei por essa página e com certeza é algo que irá se encaixar perfeitamente no script que estou planejando: um sinal específico em meu script.

    ResponderExcluir
  2. Que bom, Claudio, se precisar de alguma outra dica pode postar aqui, que eu posso tentar ajudar.
    Valeu!

    ResponderExcluir

Nota Importante

O conteúdo deste blog foi desenvolvido por mim e não foi copiado de outros locais, embora alguns poucos tópicos tenham sínteses e adaptações de outras fontes, que neste caso, serão referenciadas para se dar o devido crédito.
A reprodução é permitida desde que citada a fonte e para fins não comerciais. É proibido o uso para fins comercias sem a expressa autorização do autor.
Embora o conteúdo aqui apresentado seja testado pelo autor e/ou passado por sua aprovação, não é oferecida nenhuma garantia de que tudo funcionará corretamente ou não irá danificar os sistemas envolvidos, pois o sucesso dependerá do ambiente e/ou conhecimento do leitor.
Ao utilizar este blog, para qualquer fim, o leitor concorda com estes termos e isenta o autor de qualquer responsabilidade, ficando o uso do conhecimento aqui apresentado por sua conta e risco.
Caso discorde destes termos, gentileza fechar esta página imediatamente.

Copyright Jonathan Araújo 2010