quinta-feira, 9 de setembro de 2010

Linux: Scripts na Inicialização e RunLevels

As vezes precisamos que alguns comandos ou programas sejam executados na inicialização, uma maneira fácil de fazer isto é usando scripts registrados nos RunLevels.

Vamos criar um simples exemplo prático para entendermos como funciona este negócio todo (estes exemplos são baseados na estrutura do Ubuntu-server).

Primeiro iremos criar um script bash para teste:

#!/bin/bash
#
# /etc/init.d/teste

case "$1" in
    start)
    #Código a ser executado quando passado o parâmetro start
    echo "Script iniciado"
   
        ;;

    stop)
    #Código a ser executado quando passado o parâmetro stop
    echo "Script Parado"
        ;;

    *)
    #Ação padrão do script, caso parâmetro não for informado ou não ter sido tratado em outra opção.
    echo "Comando inválido"
        ;;
esac

Um script de inicialização deve conter pelo menos as opções start e stop. Você pode adicionar o parâmetro que quiser, simplesmente inserindo um novo bloco, por exemplo, para criar o comando status insira:
 
  status)
    #Aqui vai a ação para status.
    echo "Status: "
   
   ;;

A opção * deve ser sempre a última no script.

Após criar o script teste, coloque-o no diretório /etc/init.d/ e lhe dê permissão de execução:

chmod a+x teste

Apenas colocá-lo neste diretório não faz com que ele inicie automaticamente, temos ainda que configurá-lo no rc.d:


Os RunLevels

RunLevels como o nome já diz, são os níveis de execução, onde definimos quais scripts devem ser iniciados ou parados ao iniciar certo modo de execução. Abaixo segue uma tabela dos níveis em diferentes distros:


Run LevelGenéricoFedoraSlackwareDebian
0DesligarDesligarDesligarDesligar
1Modo mono-usuárioModo mono-usuárioModo mono-usuárioModo mono-usuário
2Modo multi-usuário básico (sem rede)Definido pelo usuário (não usado)Definido pelo usuário (configurado igual ao nível 3)Modo multi-usuário
3 Modo multi-usuário completo (Texto)Modo multi-usuárioModo multi-usuário - nível padrão Slackware
4Não usadoNão usadoX11 com KDM/GDM/XDM (gerenciadores de sessão)Modo multi-usuário
5Modo multi-usuário completo (Gráfico)Modo multi-usuário completo (com tela de login X) - nível padrãoDefinido pelo usuário (configurado igual ao nível 3)Modo multi-usuário
6RebootRebootRebootReboot



Os diretórios responsáveis pelos RunLevels do ubuntu server, se encontram em /etc.
São os diretórios rc0.d, rc1.d, rc2.d, rc3.d, rc4.d, rc5.d, rc6.d, que representam o nível do número respectivo. (Em algumas distros os diretórios dos RunLevels e init.d se encontram dentro da pasta rc.d em /etc)
Dentro destes diretórios encontram-se links simbólicos para os scripts a serem iniciados ou parados.

S19postgresql-8.4 -> ../init.d/postgresql-8.4

a sintaxe destes links são:
[Ação][ordem][nome]

As ações são  S (start) para iniciar o serviço e K(kill) para parar o serviço.
A ordem é em que posição ele irá iniciar, isto serve para evitar conflitos entre scripts que dependem de outros para funcionar.

Uma maneira fácil de adicionar ao runlevel é através de comando update-rc.d

A sintaxe é a seguinte
update-rc.d [nome] start [ordem] [runlevels] . stop [ordem] [runlevels] .

O script que você quer que inicie automaticamente já deve estar na pasta init.d e você deve fornecer ao comando apenas o nome dele, não todo o caminho.

update-rc.d teste start 80 2 3 4 5 . stop 79 0 6 .

O comando acima coloca o script teste para iniciar nos runlevels 2,3,4 e 5, na posição 80, e parar o serviço nos runlevels 0 e 6, na posição 79. Se você der um ls -l dentro da pasta rc3.d, por exemplo, verá o link referente ao script teste lá dentro com o seguinte nome: S80teste

Se quiser fazer um teste, reinicie o sistema, você verá que as mensagens configuradas no script já estarão aparecendo ao desligar e iniciar.

Para remover o script da inicialização use o comando: update-rc.d [nome] remove

update-rc.d teste remove

Com estes passos simples você já pode colocar scripts para inicializar automaticamente, em breve postarei algo sobre iptables e após como criar um script de firewall.

Até +   =)

Fontes:
linux.com - An introduction to services, runlevels, and rc.d scripts

Nenhum comentário:

Postar um comentário