trabalhando com init no debian
TRANSCRIPT
5/11/2018 Trabalhando Com Init No Debian - slidepdf.com
http://slidepdf.com/reader/full/trabalhando-com-init-no-debian 1/8
Trabalhando com init no Debian
Introdução
Este artigo irá tratar de scripts de inicialização e manipulação relacionados ao init , está agora dividido em 2 partes:
1) Ferramentas para manipular os inits.
• rcconf
• update-rc.d
• sysv-rc-conf
• sysvconfig
2) Ferramentas para trabalhar com eles.
• invoke-rc.d
• Na unha
• Script Service1 para Debian
• Script Service2 para Debian
• Script para criação e uso de um rc.local para o Debian
Existem dois estilos de init: o BSD e o SYS-V . Cada um tem suas peculiaridades. O Debian usa init SYS-V.Os scripts são armazenados em /etc/init.d e links são criados em /etc/rc?.d , onde o ? representa o runlevel.
ATENÇÃO!
Especificamente, antes de entrar em qualquer nível de execução, todos os scripts iniciados com 'K' sãoexecutados; esses scripts matam (param) serviços. Então todos os scripts iniciados com 'S' são executados;esses scripts iniciam serviços. O número de dois dígitos seguido de 'K' ou 'S' indica a ordem na qual o scripté executado. Scripts de menor valor numérico são executados primeiro.
Esse método funciona porque todos os scripts em /etc/init.d/ aceitam um argumento que pode ser "start"(iniciar), "stop" (parar), "reload" (recarregar), "restart" (reiniciar) ou "force-reload" (forçar-recarregar) e irão
portanto cumprir a tarefa indicada pelo argumento. Esses scripts podem ser usados mesmo depois que umsistema tenha sido iniciado para controlar vários processos.
Caso deseje adicionar novos serviços para iniciar junto com o boot, devemos adicionar o script em/etc/init.d/<script>.
Assim sendo, para invocar um script temos: /etc/init.d/<script> <opção>
Usuários e não-administradores de distribuições ligeiramente diferentes, sente alguma dificuldade deadaptação, quando necessita subir algum serviço e já vai logo lançando um "service", ou adicionar umrunlevel com o conhecido "ntsysv" e recebe um lindo e merecido: command not found.
Para quem sente falta de um gerenciador de runlevel no Debian, temos quatro opções legais:
1) rcconf 2) update-rc.d3) sysv-rc-conf 4) sysvconfig
5/11/2018 Trabalhando Com Init No Debian - slidepdf.com
http://slidepdf.com/reader/full/trabalhando-com-init-no-debian 2/8
rcconf
Muito semelhante ao ntsysv da Red Hat , porém com muitos problemas.
O rcconf é um front-end para o update-rc.d.
O rcconf permite você controlar que serviços são iniciados quando o sistema inicia ( :S ), ele irá mostrar umatela onde você poderá ver o status de cada serviço [*] ou [ ].
O rcconf trabalha obtendo a lista de serviços de /etc/init.d e observa nos diretórios /etc/rc?.d para determinar se cada serviço está ligado ou não no boot. Se o número NN (de /etc/rc?.d/NNname) não é 20 (padrão),rcconf salva o nome do serviço junto ao seu número em /var/lib/rcconf/services para que seja possívelrestabelecer o serviço para sua configuração original.
Instalação:
# apt-get install rcconf
Atualizar menus:
# update-rcconf-guide
Utilização:
# rcconf
Ele irá chamar uma tela demonstrando o que temos de inicialização e marcará para iniciar ou não iniciar (desativar).
Marcando a desativação, o script passará a ter, nos respectivos runlevel, o argumento K00script.
update-rc.d
Um outro mais interessante e MUITO mais eficiente é o update-rc.d .
Instalação:# apt-get install file-rc update-rc.d
Utilização:
update-rc.d <nome> start NN runlevel . stop NN runlevel .
Nome é o mesmo nome do arquivo contido em /etc/init.d, NN significa a ordem em que eles serãoiniciados/parados e runlevel especifica em quais runlevels eles serão iniciados/parados.
Exemplo com o script firewall.
NOTA: O arquivo deve estar dentro do diretório init.d.
# update-rc.d firewall start 20 2 3 4 5 . stop 20 0 1 6 .
5/11/2018 Trabalhando Com Init No Debian - slidepdf.com
http://slidepdf.com/reader/full/trabalhando-com-init-no-debian 3/8
NOTA: Se já existir uma entrada no arquivo como o nome especificado, update-rc.d não irá fazer nada.
Você também pode deixar os runlevels como padrão:
update-rc.d <nome> defaults [NN | NN-start NN-stop]
Colocando o defaults, ele irá deixar os runlevels para inicialização como: 2, 3, 4 e 5; e para finalização: 0, 1 e6 (para saber mais, leia a manpage do init). NN indica que o arquivo terá a mesma prioridade nainicialização/finalização. Para deixar diferente, especifique NN-start para a inicialização e NN-stop parafinalização.
NOTA: É recomendável sempre especificar um runlevel para os serviços serem finalizados.
Ex:
# update-rc.d firewall defaults
Já para remover um arquivo da inicialização/finalização, use:
update-rc.d [-f] <nome> remove
O -f pode ser usado para que o update-rc.d remova também links simbólicos. Este comando excluirá os linksdos rcN.d, e conseqüentemente com que o serviço seja iniciado e parado manualmente, ou seja, você
precisará usar o script em /etc/init.d/firewall <opção>.
Ex:
# update-rc.d -f firewall remove
Uma opção que pode ser usada em ambos os 3 comandos é -n. Ela faz com que update-rc.d simule o queaconteceria.
# update-rc.d -n firewall remove
Não se preocupe, ele irá mostrar a saída corretamente, porém, não haverá nenhuma alteração.
sysv-rc-conf e sysvconfig
É uma ferramenta com interface gráfica para configuração do runlevel do SysV para o terminal.
Instalação:
# aptitude install sysv-rc-conf
Dependências: os pacotes extra a seguir serão instalados:
# apt-get install libcurses-perl libcurses-ui-perl libterm-readkey-perl
Os NOVOS pacotes a seguir serão instalados:libcurses-perl libcurses-ui-perl libterm-readkey-perl sysv-rc-conf
Execução:
5/11/2018 Trabalhando Com Init No Debian - slidepdf.com
http://slidepdf.com/reader/full/trabalhando-com-init-no-debian 4/8
# sysv-rc-conf
Para incluir o seu script, visualize ele na listagem da esquerda e marque com um [X] no runlevel 2.
Para excluir, desmarque deixando a opção em branco [].
Para selecionar use a tecla de espaço.
sysvconfig
O comando sysvconfig é um editor escrito em dialog, utilizado para:
• Habilitar e desabilitar serviços;
• Editar os links dos runlevels;
• Restaurar de um arquivo backup o estado original de seus init;
• Apesar de possuir uma interface em dialog, ele também funciona em modo texto.
Ferramentas para manipular os init
invoke-rc.d
O comando invoke-rc.d nada mais é que um script que faz o trabalho bem feito de invocação dos serviçoslocalizados em /etc/init.d/<serviço>. Você deve passar como parâmetro padrão [ start | stop | force-stop |restart | reload | force-reload | status ].
Ex:
# invoke-rc.d squid reload
Uma dica, caso deseje utilizá-lo como um comando "service <serviço> [ parâmetro ]", você pode criar umalias:
# vi ~/.bashrc
alias service='invoke-rc.d'
Na UnhaaPronto, para quem gosta de bash, aí esta!
Copie o script para o diretório /etc/init.d/:
# cp script /etc/init.d/
Torne o script executável:
# chmod +x /etc/init.d/script
Entre no diretório /etc/rc2.d:
# cd /etc/rc2.d/
5/11/2018 Trabalhando Com Init No Debian - slidepdf.com
http://slidepdf.com/reader/full/trabalhando-com-init-no-debian 5/8
Crie um link para o seu script:
# ln -s /etc/init.d/script /etc/rc2.d/S19script
OBS: Como foi explicado anteriormente os scripts que iniciam com 'S' passam start como seu argumento, e o'19' assegura que o script seja chamado antes de quaisquer scripts contendo números 20 ou superiores.
Se você não precisa que o script seja um dos primeiros a iniciar, ou melhor que ele seja iniciado lá no finaldo boot, você pode colocá-lo como 99.
# ln -s /etc/init.d/script /etc/rc2.d/S99script
Para retirar o script da inicialização, apenas remova o link, assim:
# rm -f /etc/rc2.d/S99script
OBS: Os argumentos K e S devem, obrigatoriamente, estar em Caixa Alta (maiúscula).
Este problema de iniciar programas no boot é um problema crucial para os users do Debian e distribuições baseadas nela (arquivos em /etc/default não fazem efeito no Debian). No próprio manual dele, tem algumascoisas falando sobre isso. Dêem uma olhada no site do Debian.
Nota: por mais que eu não tenha especificado o Ubuntu, essa dica também vale para ele.
Script Service1
#! /bin/sh# Script versão 0.01 do service para Debian
# Esta é a primeira versão do meu script service, tudo ANTES de conhecer o invoke-rc.d.# Flavio Torres - [email protected]
case "$2" instart)
echo "Iniciando servico $1 "/etc/init.d/$1 start
;;stop)
echo "Parando servico $1 "/etc/init.d/$1 stop
;;*)echo "USO: service <script> {start|stop}"exit 1;;esacexit 0Para este script funcionar legalzinho, sem ter de executá-lo a partir de seu diretório vigente, você DEVEincluí-lo no diretório "echo $PATH" do sistema, o mesmo para o script SERVICE2 abaixo.
Service Script2
#!/bin/sh
VERSION="`basename $0` ver. 0.91"
5/11/2018 Trabalhando Com Init No Debian - slidepdf.com
http://slidepdf.com/reader/full/trabalhando-com-init-no-debian 6/8
USAGE="Uso: `basename $0` < option > | --status-all |[ service_name [ command | --full-restart ] ]"SERVICE=SERVICEDIR="/etc/init.d"
if [ $# -eq 0 ]; thenecho "${USAGE}" >&2
exit 1fi
while [ $# -gt 0 ]docase "${1}" in--help | -h | --h* )
echo "${USAGE}" >&2exit 0;;--version | -V )
echo "${VERSION}" >&2exit 0;;*)if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
cd "${SERVICEDIR}"for SERVICE in *; do
case "${SERVICE}" infunctions | halt | killall | single| linuxconf| kudzu |*rpmorig | *rpmnew | *rpmsave | *~ | *.orig)
;;
*)if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
"${SERVICEDIR}/${SERVICE}" statusfi;;esacdoneexit 0elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then
SERVICE="${1}"cd "${SERVICEDIR}"
if [ -x "${SERVICEDIR}/${SERVICE}" ]; then"${SERVICEDIR}/${SERVICE}" stop"${SERVICEDIR}/${SERVICE}" startexit $?
fielif [ -z "${SERVICE}" ]; then
SERVICE="${1}"else
OPTIONS="${OPTIONS} ${1}"fi
shift;;esacdone
5/11/2018 Trabalhando Com Init No Debian - slidepdf.com
http://slidepdf.com/reader/full/trabalhando-com-init-no-debian 7/8
if [ -x "${SERVICEDIR}/${SERVICE}" ]; then"${SERVICEDIR}/${SERVICE}" ${OPTIONS}elseecho "${SERVICE}: Servico desconhecido" >&2
exit 1fi
Script RC.LOCAL
#!/bin/sh# Script rc.local, este script eh utilizado para fazer manutencao e inicializacao no rc.local# Flavio Torres - [email protected]# Para fazê-lo útil, deve-se adicioná-lo diretorio /usr/bin/# versao 0.6 - abril de 2006
PATH=/bin:/sbin:/usr/bin:/usr/sbinexport PATH
TESTA(){if [ $? == 0 ]; then
echo -e [ 'e[40;32;1m OK e[m' ]else
echo -e [ 'e[40;31;1 ERRO e[m' ]fi}case "$1" instart)
if [ -f /etc/rc.local ]; then
exec /etc/rc.local 2>&1&> /dev/nullelseecho "O arquivo rc.local nao existe, utilize a opcao add."
fi;;stop)
echo "Sem acao";;
status)echo "Sem acao"
;;
restart|reload)$0 stop$0 start
;;
add)
DIR="/etc/init.d"ARQ="/etc/rc.local"
if [ -e /etc/rc.local ]; thenprintf ""
elseecho "Criando configuracoes..."
5/11/2018 Trabalhando Com Init No Debian - slidepdf.com
http://slidepdf.com/reader/full/trabalhando-com-init-no-debian 8/8
touch /etc/rc.local && chmod 755 /etc/rc.localln -s /usr/bin/rc.local /etc/init.d/rc.localupdate-rc.d rc.local start 99 2 3 4 5 . stop 99 0 1 6 .TESTA
fiecho "Entre com o nome do script: "read NOMEgrep $NOME $ARQif [ $? == 0 ]; then
echo "^^^, O arquivo ja esta adicionado."if [ -e $DIR/$NOME ]; thenprintf ""else
chmod 755 $NOME && cp $NOME $DIR printf "Porem nao existia em $DIR, adicionando..."TESTA
fielif [ -e $DIR/$NOME ]; then
chmod 755 $DIR/$NOME && echo $DIR/$NOME >> $ARQTESTAelsechmod 755 $NOME && cp $NOME $DIR && echo $DIR/$NOME >> $ARQTESTA
fi
;;*)echo -n "Uso: $0 {add|start|stop|status|restart}"echo
exit 1esac