Come posso fare in modo che uno script in /etc/init.d inizi all'avvio?


83

Penso di aver letto qualcosa qualche tempo fa su questo, ma non ricordo come è stato fatto. In sostanza, ho un servizio in /etc/init.dcui vorrei avviarlo automaticamente all'avvio. Ricordo che ha qualcosa a che fare con il collegamento simbolico dello script nella /etc/rc.ddirectory, ma al momento non ricordo. Qual è il comando per questo?

Credo di essere su un derivato Fedora / CentOS.


Dipende dal tuo sistema operativo. Quale variante unix stai usando e, se Linux, quale distribuzione? Quale tra /etc/init, /etc/init.d, /etc/rc.d, /etc/rc.locale pochi altri ha?
Gilles,

1
Penso di essere su CentOS o qualcosa del genere. La risposta sarebbe diversa per Debian? Sono interessato a una soluzione anche per Debian.
Naftuli Kay,

Risposte:


109

Se utilizzi un sistema basato su Red Hat, come hai già detto, puoi fare quanto segue:

  1. Crea uno script e posizionalo in /etc/init.d(ad es /etc/init.d/myscript.). Lo script dovrebbe avere il seguente 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 

Il formato è piuttosto standard ed è possibile visualizzare gli script esistenti in /etc/init.d. È quindi possibile utilizzare lo script in questo modo /etc/init.d/myscript starto chkconfig myscript start. La ckconfigpagina man spiega l'intestazione dello 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.

Il codice start, stop e status di esempio utilizza le funzioni di supporto definite in /etc/init.d/functions

  1. Abilita lo script

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Controlla che lo script sia effettivamente abilitato - dovresti vedere "on" per i livelli che hai selezionato.

    $ chkconfig --list | grep myscript
    

3
Chkconfig è quello che vuoi. +1
whoami,

Perché init inizia qualcosa ai runlevel 2, 3, 4 e 5? Non devi fare attenzione a non avviare un server al runlevel 2? E runlevel 4 non è definito su RHEL comunque, quindi perché provare ad avviarlo a quel runlevel? Non critiche, voglio solo sapere. Sono un utente nativo di Slackware.
Bruce Ediger,

4 non è definito su RHEL, ma esiste. Puoi rubarlo per le tue cose.
Kevin M,

L'intestazione è tratta dalla pagina man di chkconfig. Personalmente rimango con 235 o solo 35 nella maggior parte dei casi.
Canen,

C'è un registro che posso guardare se qualcosa non si avvia durante l'avvio?
Utkarsh Sinha,

10

Test, in quale runlevel inizia normalmente la tua macchina.

runlevel

Spesso si tratta di 5 o 2 - ci sono varie convenzioni, ma nulla di veramente stabilito, a parte. Ubuntu usa 2, mentre la precedente distribuzione che ho sempre usato

  • 1 utente singolo (super utente)
  • 2 multiutente
  • 3 multiutente + rete
  • 4 non utilizzato / definibile dall'utente
  • 5 multiutente, rete + X11

Quindi crei un collegamento simbolico dal tuo script di script, forse /etc/init.d/foobara/etc/rc2.d/SXYfoobar

S significa 'Avvia questo script in questo runlevel (qui: 2). XY è un numero decimale a due cifre, che è rilevante per la sequenza, gli script vengono avviati.

Se dipendi dallo script S45barfoo da eseguire prima di te e S55foofoo dipende dal tuo script, scegli xy tra 45 e 55. Per numeri uguali l'ordine di avvio non è definito.

Ubuntu nel frattempo è passato (sta passando) a un'altra procedura di avvio, chiamata upstart.

E nota: non sempre i collegamenti si collegano a /etc/rcX.d- a volte è /etc/init/rcX.do qualcosa di simile, ma dovrebbe essere facile da trovare, da qualche parte sotto / ecc.

Se vuoi avviare qualcosa alla fine degli script di avvio, /etc/rc.localsarebbe un file da cercare, ma se dipende da X11 già in esecuzione, potresti cercare un'opzione di avvio automatico del tuo ambiente desktop o /etc/X11/Xsession.d/con un modello simile come descritto sopra.

Se dipendi dalla rete attiva, esiste una directory separata (if-up.d) e per i dispositivi montati come unità USB esterne /etc/udev/rules.d/.


Non c'è un comando che fa il collegamento simbolico per te? Pensavo di aver ricordato qualcosa del genere.
Naftuli Kay,

1
No update-rc.d?
Naftuli Kay,

GUI o riga di comando? Il tuo DE potrebbe fornire uno strumento per contrassegnare i runlevel, da dove iniziare o interrompere lo script. Ho visto qualcosa del genere, ma non ricordo un nome e come specificare il numero (xy).
utente sconosciuto

Riga di comando. Gestisce il collegamento simbolico per te e ti consente di attivare o disattivare alcuni script.
Naftuli Kay,

3

Come Naftuli Tzvi Kay ha chiesto di Debian sopra: a partire da Debian 6, il tuo script dovrebbe contenere un'intestazione LSB (Linux Standards Base) che indica le sue dipendenze e capacità ( vedi la pagina wiki di debian ).

Se è presente un'intestazione LSB, è possibile utilizzare insservper includere lo script nel processo di avvio ( vedere un'altra pagina wiki debian ).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.