Condividi su Facebook
Init script e runlevel
Scritto da: Monska il 13/06/2010 alle 19:04
Tag: Varie, Linux, Bash, Informatica, Sistemi Operativi.Visto 243 volte.


Fedora

Spesso può essere estremamente utile riuscire a implementare uno script in bash che gestisca un servizio scritto da noi o semplicimente un servizio con delle configurazioni particolari.

Come ben sappiamo, in genere, gli script di avvio dei servizi di linux sono collocati nella cartella

Code:

/etc/init.d/

Oggi vedremo quale può essere la struttura di uno script di inizializzazione di servizio, ed in particolare vedremo come configurare tale script per essere aggiunto al gestore

Code:
chkconfig

presente nelle distribuzioni derivanti da Red Hat.

Nel corso dell'articolo verranno utilizzate le path di un sistema Fedora, ma l'albero delle directory risulta essere pressochè identico nelle altre distribuzioni.

I runlevel
Per prima cosa è necessario comprendere come i servizi vengono attivati/disattivati durante la fase di avvio di un computer.
Il sistema Linux durante il suo avvio passa attraverso dei runlevel che definiscono quali servizi vanno avviati e quali vanno invece fermati.
Le cartelle che definiscono i runlevel sono:

Code:

/etc/rc{0|1|2|3|4|5|6}.d

dove il numero che segue rc è il numero del runlevel.

A livello informativo, in generale, il runlevel 3 è quello che viene utilizzato negli ambienti privi di interfaccia grafica, il cui unico accesso al sistema avviene da linea di comando. Il runlevel 5 definisce l'avvio dell'interfaccia grafica. Il runlevel 6 definisce l'attività di reboot.

Altra nozione importante è la nomenclatura dei link presenti in tali cartelle. Come avremo notato, tutti i link sono nominati seguendo questa logica:

Code:

{S|K}{XX}{name}

In questa nomenclatura è racchiuso cosa il sistema operativo deve fare in fase di avvio nei vari runlevel.

Il primo blocco

Code:

{S|K}

definisce se il servizio deve essere avviato o fermato nel runlevel.
Il sistema operativo eseguirà il comando linkato con paramentro start nel caso in cui il link incominci con S; con il paramentro stop nel caso in cui il link incominci con K.

Il secondo blocco rappresenta un numero progressivo che serve solo a definire l'ordine con cui i servizi devono essere avviati/fermati. Ovviamente nel caso in cui si faccia uno start con numero alto, ad esso corrisponderà, in generale, uno stop con numero basso.

Il terzo blocco è un nome rappresentativo del servizio, in genere viene utilizzato lo stesso nome dello script di init.

Gli script di Init
Dopo aver appreso le nozioni di base sui runlevel possiamo passare a concentrarci su come strutturare uno script per la gestione di un servizio.

Nella sua forma più semplice, uno script di init presenta come opzioni disponibili le opzioni

Code:

{start|stop|restart|status}

Per rendere più semplice e veloce la modifica e la gestione di uno script di init consigliamo di utilizzare delle funzioni, in modo da attuare sempre le stesse attività e non dimenticare nessun comando.

Per implementare uno script di init, utilizzando le opzioni di base, avremo bisogno di 4 funzioni:
~ usage: che spiega all'utente come si utilizza lo script
~ start: che avvia il servizio
~ stop: che ferma il servizio
~ status: che informa l'utente sullo stato del servizio
Non occorre una funzione di restart poichè, a meno di particolari necessità, si può applicare in sequenza la funzione stop e start.

Iniziamo quindi con le funzioni:

Code:

function usage{
   base=$(basename $0)
   echo -e "Usage:\n$base {start|stop|restart|status}"
}

function start{
   <comando di start del servizio>
}

function stop{
   <comando di stop del servizio>
}

function status{
   <print dello stato del processo (/var/run/*.pid)>
}

Una volta definite le funzioni, dobbiamo posizionarle all'interno di uno switch:

Code:

if [ "$1" == "" ]
then
   usage
   exit 1
fi

case "$1" in
   "start")
      start;;
   "stop")
      stop;;
   "restart")
      stop
      sleep 3
      start;;
   "status")
      status;;
esac

Al nostro script manca solo una intestazione corretta, che definisca l'interprete e la prima configurazione di chkconfig.
Tale intestazione è rappresentata da:

Code:

#!/bin/bash
# chkconfig: 345 98 55

La parte più interessante risulta essere la direttiva di chkconfig. Essa definisce con 3 numeri una serie di paramentri:

Code:

345

questo numero defnisce i runlevel nei quali il servizio sarà ON. In questo caso i runlevel 3,4 e 5.


Code:

98

questo numero definisce la parte numerica del link che verrà creato nelle cartelle dei runlevel (/etc/rcX.d) per quanto riguarda lo START del servizio.
Il risultato dell'aggiunta al gestore chkconfig produrrà quindi nelle cartelle /etc/rc{3|4|5}.d dei link come il seguente:

Code:
S98<name>


Code:

55

questo numero definisce la parte numerica del link che verrà creato nelle cartelle dei runlevel (/etc/rcX.d) per quanto riguarda lo STOP del servizio.
Il risultato dell'aggiunta al gestore chkconfig produrrà quindi nelle cartelle /etc/rc{1|2|6}.d dei link come il seguente:

Code:
K55<name>

La composizione di intestazione, funzioni e switch, dovrebbe comporsi come il seguente script:

Code:

#!/bin/bash
# chkconfig: 345 98 55

function usage{
   base=$(basename $0)
   echo -e "Usage:\n$base {start|stop|restart|status}"
}

function start{
   <comando di start del servizio>
}

function stop{
   <comando di stop del servizio>
}

function status{
   <print dello stato del processo (/var/run/*.pid)>
}

if [ "$1" == "" ]
then
   usage
   exit 1
fi

case "$1" in
   "start")
      start;;
   "stop")
      stop;;
   "restart")
      stop
      sleep 3
      start;;
   "status")
      status;;
esac


Potete scaricare il modello qui.
Questo script, come tutti gli altri init script, è consigliabile inserirlo nella cartella

Code:
/etc/init.d

Ora non ci resta che aggiungere il nostro script di start/stop del nostro servizio al gestore chkconfig.
Per farlo, se abbiamo inserito correttamente la riga di intestazione dello script, ci basterà dare il seguente comando:

Code:

chkconfig --add /etc/init.d/<name>

Se il comando non restituisce errori possiamo verificare la corretta configurazione attraverso:

Code:
chkconfig --list | grep <name>

che ci mostrerà come viene gestito il nostro script di init nei vari runlevel.

chkconfig


Aggiungi un commento:
Nick:
captchaInserire il codice: