Como executar um script de shell na inicialização?

13

Eu criei um script para iniciar um servidor (minha primeira pergunta). Agora eu quero que ele seja executado na inicialização do sistema e inicie o servidor definido. O que devo fazer para fazer isso?

Minhas descobertas me dizem para colocar esse arquivo no /etc/init.dlocal e ele será executado quando o sistema inicializar. Mas não consigo entender como será o primeiro argumento na inicialização start? Isso é predefinido em algum lugar para usar startcomo $1? Se eu quiser ter um caso startallque inicie todos os servidores no script, quais são as opções que eu posso gerenciar?

Meu script é assim:

#!/bin/bash

case "$1" in
start)
     start
    ;;
stop)
    stop
    ;;

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac
vijay.shad
fonte
Eu sei que isso é antigo ... mas o shell deve ser '#! / Bin / sh' não '#! / Bin / bash' / bin / sh provavelmente funcionará no caso de uma máquina com problemas durante a inicialização (por exemplo, / usr / lib não ser capaz de ser montada)
rico Homolka

Respostas:

19

/etc/init.dé o diretório do script, no qual os scripts executáveis ​​aparecem. No entanto, para executar scripts em uma ordem específica após o início do sistema, você precisa adicionar arquivos ao /etc/rc#.ddiretório. As entradas que aparecem aqui informam ao sistema em que ordem e em que scripts no nível de execução /etc/init.ddevem ser executados. O número após o rc indica em que nível de execução a máquina está executando, de acordo com esta tabela:

http://en.wikipedia.org/wiki/Runlevel

Então, se você tem:

/etc/init.d/importantscript

Então você precisa dos arquivos (vazios):

/etc/rc.d/rc3.d/S20importantscript
/etc/rc.d/rc6.d/K20importantscript

OS significa começar e K significa matar. Quando sua máquina iniciar, o sistema dirá "Ah, estou executando o RunLevel 3, vamos para o rc3.d para ver quais scripts no '/etc/init.d' precisam ser executados e em que ordem". Nesse caso, o sistema classificará por 'S' e depois o número após 'S' e executará '/etc/init.d/importantscript start'. O 20 é apenas para fins de pedido ... seu script será executado atrás de 'S19' e na frente de 'S21'. Você pode criar esses arquivos simplesmente fazendo:

sudo touch /etc/rc.d/rc3.d/S20importantscript

Aqui também está um bom resumo: http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts

aronchick
fonte
não é mais comum "ln -s /etc/init.d/script" para rcX.d / *?
Ozma
8

Você não precisa --- e não deve --- criar arquivos /etc/rc.d/rcN.d/; o que você deve fazer é colocar um comentário na leitura do script init

# chkconfig NNN A B

onde NNNé o conjunto de níveis de execução em que deseja que o script ativo (por exemplo, 345se é ativo nos níveis de execução 3, 4e 5), e Ae Bsão as prioridades de início e de parada. Então chkconfig --add foo(supondo que seu script seja nomeado foo) criará os arquivos /etc/rc.d/rcN.d/com os nomes apropriados.

Então você pode usar service foo barpara enviar a barmensagem para o seu script (por exemplo, start, stop, qualquer que seja - que é onde o seu $1vem).

Pedro
fonte
0

O $ 1 é o argumento da linha de comando que é passado para o seu script, é um de iniciar, parar ou reiniciar. No openSUSE , não me lembro de ter a opção de passar outros argumentos para o script ao usar o editor de nível de execução, então acho que esses provavelmente são os únicos que você deve usar.

Eu não uso o CentOS , mas parece que o programa para controlar o que é iniciado no qual o nível de execução é ntsysv .

Neal
fonte