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.