Como posso fazer um script no /etc/init.d iniciar na inicialização?

83

Acho que li algo sobre isso um tempo atrás, mas não me lembro como isso é feito. Basicamente, eu tenho um serviço no /etc/init.dqual gostaria de iniciar automaticamente no momento da inicialização. Lembro que isso tem algo a ver com o link simbólico do script para o /etc/rc.ddiretório, mas não me lembro no momento. Qual é o comando para isso?

Eu acredito que estou em um derivado do Fedora / CentOS.

Naftuli Kay
fonte
Isso depende do seu sistema operacional. Qual variante unix você está executando e, se o Linux, qual distribuição? Que, entre /etc/init, /etc/init.d, /etc/rc.d, /etc/rc.locale um pouco mais que isso tem?
Gilles
11
Acho que estou no CentOS ou algo parecido. A resposta seria diferente para o Debian? Também estou interessado em uma solução para o Debian.
Naftuli Kay 08/09/11

Respostas:

109

Se você estiver em um sistema baseado na Red Hat, como você mencionou, poderá fazer o seguinte:

  1. Crie um script e coloque /etc/init.d(por exemplo /etc/init.d/myscript). O script deve ter o seguinte formato:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

O formato é bastante padrão e você pode visualizar os scripts existentes no /etc/init.d. Em seguida, você pode usar o script assim /etc/init.d/myscript startou chkconfig myscript start. A ckconfigpágina do manual explica o cabeçalho do script:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

O exemplo de código de início, parada e status usa funções auxiliares definidas em /etc/init.d/functions

  1. Ativar o script

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Verifique se o script está realmente ativado - você deve ver "on" para os níveis selecionados.

    $ chkconfig --list | grep myscript
    
canen
fonte
3
Chkconfig é o que você quer. +1
whoami
Por que o init iniciou algo nos níveis 2, 3, 4 e 5? Você não precisa tomar cuidado para evitar iniciar um servidor no nível de execução 2? E o nível de execução 4 não está definido no RHEL, então por que tentar iniciá-lo nesse nível de execução? Não é crítica, apenas querendo saber. Eu sou um usuário nativo do Slackware.
precisa saber é o seguinte
4 não está definido no RHEL, mas existe. Você pode roubá-lo por suas próprias coisas.
Kevin M
O cabeçalho é obtido na página do manual chkconfig. Pessoalmente, fico com 235 ou apenas 35 na maioria dos casos.
canen
Existe um log que eu possa ver se algo falhar ao iniciar durante a inicialização?
Utkarsh Sinha
10

Você testa em qual nível de execução sua máquina normalmente inicia.

runlevel

Geralmente, são 5 ou 2 - existem várias convenções, mas nada realmente estabelecido. O Ubuntu usa 2, enquanto a distribuição anterior eu costumava usar sempre

  • 1 usuário único (superusuário)
  • 2 multiusuário
  • 3 multiusuário + rede
  • 4 não utilizado / definível pelo usuário
  • 5 multiusuário, rede + X11

Então você cria um link simbólico a partir do seu script init, talvez /etc/init.d/foobarpara/etc/rc2.d/SXYfoobar

S significa 'Inicie este script neste nível de execução (aqui: 2). XY é um número decimal de dois dígitos, relevante para a sequência, os scripts são iniciados.

Se você depende do script S45barfoo para ser executado antes de você, e o S55foofoo depende do seu script, escolha xy entre 45 e 55. Para números iguais, a ordem de inicialização é indefinida.

Enquanto isso, o Ubuntu mudou (está alternando) para outro procedimento de inicialização, chamado upstart.

E observe: nem sempre os links apontam para /etc/rcX.d- às vezes é /etc/init/rcX.dou algo semelhante, mas deve ser fácil de encontrar, em algum lugar abaixo de / etc.

Se você deseja iniciar algo no final dos scripts de inicialização, /etc/rc.localseria um arquivo a procurar, mas, se o X11 já estiver em execução, poderá procurar uma opção de inicialização automática do ambiente da área de trabalho ou /etc/X11/Xsession.d/com um padrão semelhante ao descrito acima.

Se você depende da rede estar ativa, existe um diretório separado (if-up.d) e para dispositivos montados, como unidades USB externas /etc/udev/rules.d/.

Usuário desconhecido
fonte
Não existe um comando que faça o link simbólico para você? Eu pensei que me lembrava de algo assim.
Naftuli Kay 09/09/11
11
Não foi update-rc.d?
Naftuli Kay 09/09/11
GUI ou linha de comando? Seu DE pode fornecer uma ferramenta para marcar os níveis de execução, onde iniciar ou parar seu script. Eu já vi algo assim, mas não lembro de um nome e como especificar o número (xy).
usuário desconhecido
Linha de comando. Ele lida com o link simbólico para você e permite que você alterne entre determinados scripts executados ou não.
Naftuli Kay 09/09/11
3

Como Naftuli Tzvi Kay perguntou sobre o Debian acima: A partir do Debian 6, seu script deve conter um cabeçalho LSB (Linux Standards Base) que indica suas dependências e capacidades ( consulte a página de wiki do debian ).

Se um cabeçalho LSB estiver presente, você pode usar insservpara incluir seu script no processo de inicialização ( veja outra página wiki da debian ).

mdt
fonte