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.

[ Hits: 48.302 ]

Por: Danillo Costa em 23/08/2011 | Blog: https://nillow.com.br/


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

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

   

Páginas do artigo
   1. Mão na massa
Outros artigos deste autor

flock - Gerenciador de lockfiles

Blacklist - O que é? Como consultar o IP? Como automatizar?

Shell Script como serviço no Windows

rwd - Restart When Down

Adium, IM open source

Leitura recomendada

Bacula - Instalação no XenServer 6

GLPI - Implantação de Central de Serviços

Taskwarrior, o Guerreiro das Tarefas - Gerenciar sua Lista TODO no Terminal

Como contribuir com a atualização de pacotes no Void Linux

Metisse + Gnome + Slackware (3D Desktop)

  
Comentários
[1] Comentário enviado por removido em 23/08/2011 - 10:19h

Legal !

[2] Comentário enviado por lucasdona em 24/08/2011 - 13:31h

Showww, funcionou, mas meu sistema parou de entrar com login automatico, agora ele para na tela de login do xdm...
Agora, não sei o que uma coisa tem a ver com a outra. Sei que ele funcionou porque vou no terminal alternativo e listo o processo.

[3] Comentário enviado por hellnux em 24/08/2011 - 13:54h

@lucasdona

Estranho mesmo, deve ter ficado alguma coisa errada pelo caminho. Cheque o /etc/inittab, o cabeçalho do arquivo em init.d. Também pode ser dado o chkconfig --list para vericar o runlevel que seu script fora ativado. Através do chkconfig tem como desabilitar em algum runlevel em especifico.

[4] Comentário enviado por lucasdona em 24/08/2011 - 14:36h

Removi tudo, desinstalei... e continou não logando, inclusive eu tentava entrar mas ele retornava pra tela de login novamente.
Já até voltei com uma .iso que eu tinha gravado. :-)

[5] Comentário enviado por lucasdona em 24/08/2011 - 14:39h

mas, deixa eu entender uma coisa, runlevel seria o tty que estou usando? qndo aperto ctrl+alt f1, f2.. cada terminal alternativo desse é um runlevel? porque eu desabilito quase todos, deixo só 2.

[6] Comentário enviado por lucasdona em 24/08/2011 - 14:41h

hehehe, pouqin de google as vezes nun faz mal ne... runlevel é isso mesmo, então é possível este erro estar acontecendo por algum runlevel estar desabilitado, mas o scipt inicia normalmente por trás.. fico sem entender ainda.

[7] Comentário enviado por lucasdona em 24/08/2011 - 14:46h

Acho que já sei, acho que tinha colocado para rodar no runlevel 3, no caso teria que colocar para rodar no runlevel 4 que inicia o sistema gráfico, achi que pode ser isso.

[8] Comentário enviado por AprendiNoLinux em 25/08/2011 - 07:05h

Parabéns Danillo Costa aka @hellnux, isto não é uma dica e sim um tremendo artigo :)

Ainda não segui o seu passo a passo. Confesso que estava no meio do caminho para fazer exatamente o que foi mostrado. Batendo lata pra cá e pra lá para fazer inicializadores de serviços para uns mini daemons que estou tentando criar. :)
Tenho certeza que este "artigo" ou "dica" será de grande importância :)

Vou colocar no forum também porque achei muito importante.

Valeu @Ga_Tux

[9] Comentário enviado por Hebang em 25/08/2011 - 13:33h

Parabéns pelo material, porém gostaria de "depositar" meus 2 cents:

* No seu script, para verificar se o processo está rodando, você filtra a saída do comando ps a procura do seu servico e, por fim, aplica mais um filtro removendo o grep (para remover o proprio grep do resultado). Porém, se o seu servico se chamar "agrepin" por exemplo, seu script falha.

Acho que o mais ideal seria trabalhar com o PID do processo criado.

É só uma observação.

Parabéns novamente!

[10] Comentário enviado por hellnux em 25/08/2011 - 13:58h

@All
Obrigado por comentarem.

@Hebang
Obrigado pela contribuição, vou estudar sobre.
Testei sobre a falha usando exatamento o nome "agrepin" e realmente falha. Para corrigir, utilize:

kill `ps aux | grep $script | grep -v -w "grep" | awk '{print $2}'`

A diferença? Tem o argumento "w" que filtra exatamente a string passada.

[11] Comentário enviado por mopar em 09/02/2012 - 11:37h

Bom dia hellnux. Obrigado por postar esse artigo. Gostaria de lhe informar que o exemplo que vc descreveu funcionou perfeitamente porém quando fui aplicar em script de firewall que fiz o mesmo não é adicionado no ntsysv . Uso a distro Centos 5. Já quebrei a cabeça e não consegui até agora rodar meu script automático no boot. Já tentei de todas as formas, tanto pelo rc.local quanto pelo serviço. Gostaria de saber se existe alguma incompatibilidade em um script chamar outro script pelo boot. O mais interessante é que via konsole funciona perfeito. Tambpem estou tentando fazer a mesma coisa com um script de vpn mas até agora sem sucesso. Agradeço um retorno.

[12] Comentário enviado por hellnux em 09/02/2012 - 22:23h

@mopar

Complicado dizer o que pode ser se não conheço teu código e não sei como você procedeu. Você diz que funcionou perfeitamente, acredito que tenha testado com outro script, mas depois cita o ntsysv, sendo que o foco do artigo é o chkconfig.

Verifique se o script é o último a ser inicializado, ou até mesmo insira um código em seu shell script que escreva a data e horário em um arquivo, só para ver se está executando além daquele ponto.

[13] Comentário enviado por antonio_edmilson em 02/04/2012 - 14:31h

Muito bom!

[14] Comentário enviado por endrigo.fantast em 03/05/2012 - 01:49h

hellnux, parabéns.

No lugar do date-arq.sh posso ter um executável tipo console compilado do Lazarus por exemplo ao invés de um script? Teria que ficar em um loop realizando minhas tarefas, como foi no seu exemplo?

[15] Comentário enviado por hellnux em 03/05/2012 - 08:27h

@endrigo.fantast

Nunca testei, mas acredito fortemente que funcione. Só substituir a linha abaixo pelo teu comado:
/bin/bash /opt/$script &

E talvez tenha que muda a linha da função stop.

Faça o teste e poste o resultado. ^^


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts