
Tag: Varie, Linux, Bash, Informatica, Sistemi Operativi.Visto 1911 volte.
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:
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:
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:
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:
In questa nomenclatura è racchiuso cosa il sistema operativo deve fare in fase di avvio nei vari runlevel.
Il primo blocco
Code:
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:
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:
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:
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:
# chkconfig: 345 98 55
La parte più interessante risulta essere la direttiva di chkconfig. Essa definisce con 3 numeri una serie di paramentri:
Code:
questo numero defnisce i runlevel nei quali il servizio sarà ON. In questo caso i runlevel 3,4 e 5.
Code:
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:
Code:
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:
La composizione di intestazione, funzioni e switch, dovrebbe comporsi come il seguente script:
Code:
# 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:
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:
Se il comando non restituisce errori possiamo verificare la corretta configurazione attraverso:
Code:
che ci mostrerà come viene gestito il nostro script di init nei vari runlevel.



errore durante la lettura delle informazioni sul servizio script.sh: Descrittore di file non valido
Grazie.
Ciao,
assicurati che lo script sia eseguibile prima del
chkconfig --add script.sh
1.) chmod +x script.sh
2.) chkconfig --add script.sh