Come eseguire uno script di shell all'avvio?


13

Ho creato uno script per avviare un server (la mia prima domanda). Ora voglio che venga eseguito all'avvio del sistema e avviare il server definito. Cosa devo fare per farlo?

I miei risultati mi dicono di mettere questo file nella /etc/init.dposizione, e verrà eseguito all'avvio del sistema. Ma non riesco a capire come sarà il primo argomento all'avvio start? Questo è predefinito da qualche parte da usare startcome $1? Se voglio avere un caso startallche avvierà tutti i server nello script, quali sono le opzioni che posso gestire?

La mia sceneggiatura è così:

#!/bin/bash

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

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac

So che questo è vecchio ... ma la shell dovrebbe essere '#! / Bin / sh' non '#! / Bin / bash' / bin / sh ha maggiori probabilità di funzionare nel caso di una macchina che ha problemi durante l'avvio (es. / usr / lib non può essere montato)
Rich Homolka

Risposte:


19

/etc/init.dè la directory degli script, in cui vengono visualizzati gli script eseguibili. Tuttavia, per eseguire gli script in un ordine particolare dopo l'avvio del sistema, è necessario aggiungere file alla /etc/rc#.ddirectory. Le voci che appaiono qui indicano al tuo sistema in quale ordine e in quale esecuzione eseguire gli script a livello /etc/init.d. Il numero dopo il rc indica a quale livello di marcia sta girando la macchina, secondo questo grafico:

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

Quindi se hai:

/etc/init.d/importantscript

Quindi hai bisogno dei file (vuoti):

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

La S significa iniziare e la K significa uccidere. All'avvio della macchina, il sistema dirà "Ah, sono in esecuzione su RunLevel 3, andiamo su rc3.d per vedere quali script in '/etc/init.d' devono essere eseguiti e in quale ordine." In questo caso, il sistema ordinerà per 'S' e quindi il numero dopo 'S' ed eseguirà '/etc/init.d/importantscript start'. Il 20 è solo a scopo di ordinazione ... la tua sceneggiatura verrà eseguita dietro "S19" e davanti a "S21". Puoi creare questi file semplicemente facendo:

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

Ecco anche un bel riassunto: http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts


non è più comune a "ln -s /etc/init.d/script" su rcX.d / *?
ozma,

8

Non devi --- e non dovresti --- creare file in /etc/rc.d/rcN.d/; quello che dovresti fare invece è inserire un commento nella lettura dello script init

# chkconfig NNN A B

dove NNNè l'insieme di runlevel in cui si desidera lo script attivo (per esempio, 345se è attiva nel runlevel 3, 4e 5), ed Ae Bsono le priorità di inizio e di arresto. Quindi chkconfig --add foo(supponendo che il tuo script sia chiamato foo) creerà i file /etc/rc.d/rcN.d/con i nomi appropriati.

È quindi possibile utilizzare service foo barper inviare il barmessaggio al vostro script (ad esempio, start, stop, qualunque sia - è lì che il vostro $1viene da).


0

$ 1 è l'argomento della riga di comando che viene passato allo script, è uno di avvio, arresto o riavvio. In openSUSE , non ricordo di avere un'opzione per passare altri argomenti nello script quando uso l'editor di runlevel, quindi penso che questi siano probabilmente gli unici che dovresti usare.

Non uso CentOS da solo, ma sembra che il programma per controllare ciò che viene avviato a quale runlevel è ntsysv .

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.