chkconfig - Adicionando o seu shell script
O chkconfig é uma ferramenta capaz de gerenciar a inicialização/finalização de múltiplos serviços, presente em algumas distribuições. Há muito material
explicando como o utiliza, porém, não muito para aqueles que necessitam adicionar suas soluções como serviço. Mostrarei como criar um shell script para
gerenciar um serviço próprio.
explicando como o utiliza, porém, não muito para aqueles que necessitam adicionar suas soluções como serviço. Mostrarei como criar um shell script para
gerenciar um serviço próprio.
Mão na massa
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
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
# 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