Introdução
O ambiente utilizado foi o CentOS 5.5/5.6, amplamente utilizado em servidores web.
Recentemente surgiram diversas necessidades em que um shell script consegue resolver bem, sendo que alguns destes scripts devem estar sempre
rodando e sem que haja um
humano de olho.
Os serviços existentes podem ser gerenciados através do comando service, como o exemplo abaixo que se refere ao servidor Web Apache:
# service httpd restart
Assim tive a ideia de utilizar o service em vez do cron, o que facilita o gerenciamento e a utilização pelos demais que possuem acesso ao servidor.
A maioria dos serviços podem ser visualizados através do comando:
# chkconfig --list
A saída do comando acima mostrará o nome do serviço seguido de seus runlevels(0 ao 6), descrevendo se estão habilitados ou desabilitados. Caso não
saiba qual é o runlevel
padrão da máquina, basta verificar no arquivo
/etc/inittab. Utilizarei o runlevel 3, que se refere a utilização do sistema operacional em modo
de texto.
Criando o shell script
Nosso shell script a ser utilizado pelo chkconfig irá gerenciar outro shell script. Como o nosso foco é o chkconfig, não irei complicar neste segundo shell
script, que terá a função de
imprimir a data em um arquivo de 5 em 5 minutos, apenas para fins didático.
Salve o conteúdo abaixo no arquivo
date-arq.sh em
/opt. Lembrando que o /opt não é o diretório padrão para scripts
desenvolvidos pelo usuário. Caso queira utilizar outro diretório, basta editar o código.
#!/bin/bash
time=300 # segundos
count=0
while [ $count -eq 0 ]; do
date >> /opt/date.txt
sleep $time
done
Agora salve o conteúdo abaixo no arquivo
date-arq em
/etc/init.d. O nome do arquivo será o que você irá utilizar no comando
service.
#!/bin/bash
# chkconfig: 3 98 99
# description: Imprime data em arquivo
RETVAL=0
script="date-arq.sh"
function start () {
if [ "`ps aux | grep $script | grep -v grep`" != "" ]; then
echo "O script $script já está em execução."
exit 1
else
/bin/bash /opt/$script &
fi
}
function stop () {
kill `ps aux | grep $script | grep -v "grep" | awk '{print $2}'`
}
function status () {
if [ "`ps aux | grep $script | grep -v "grep"`" != "" ]; then
return="Iniciado."
else
return="Parado."
fi
echo $return
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
status)
status
;;
*)
echo "Uso: $0 {start|stop|restart|status}"
RETVAL=1
esac
exit $RETVAL
Instalando
Basicamente é necessário apenas dois comandos para adicionar o shell script ao chkconfig, porém, pode retornar algum erro, como falta de permissão.
Desta forma postarei da
forma que fiz:
# cd /etc/init.d
# chmod 755 date-arq
# chkconfig --add date-arq ;
# chkconfig --level 3 date-arq on
Com o último comando, especificamos que o script iniciará automaticamente no runlevel 3. Mas como já estamos com o sistema operacional em execução,
para iniciar a
execução do script, dê:
# service date-arq start
Para verificar se está rodando, pode checar através do "ps aux" ou pelo comando:
# service date-arq status
Se forem editar/atualizar o código do script que está em /opt sendo que o serviço já está iniciado, terá de usar o "service date-arq restart" para carregar o
novo código.
O que aconteceu?
O chkconfig criou links simbólicos apontando para o shell script em /etc/init.d dentro dos diretórios dos runlevel /etc/rc[0-6].d, dê uma olhada no diretório:
ls -l /etc/rc3.d
Observe que os links simbólicos ou começam com S (start) ou com K (kill) seguido de um número que representa a sua sequência de carregamento. Para o
nosso script foi
criado apenas em
/etc/rc3.d o link que começa com "S" e o "K" foi criado nos demais diretórios referente aos outros runlevel.
A sequência de carregamento é especificada na segunda linha do script em /etc/init.d. O "98" é de inicialização(S) e o "99" é referente a finalização(K). E o
"3" se refere ao
runlevel padrão. Caso o script for para inicializar no runlevel 3, 4 e 5 por exemplo, deve deixa-lo como "345", como abaixo:
# chkconfig: 345 98 99
Os números de inicialização/finalização podem ser os mesmos. Também podem ser iguais a de outros serviços, mas se o seu script for necessário apenas
após a
inicialização do Apache, por exemplo, basta colocar um número superior.
Desinstalando
# service date-arq stop
# chkconfig --del date-arq
# rm -f /etc/init.d/date-arq
# rm -f /opt/date-arq.sh
Considerações finais
Sintam-se livres para darem sugestões de melhorias.
Fonte de pesquisa:
http://spiralbound.net/blog/2006/11/15/controlling-services-with-chkconfig