
Tag: Varie, Linux, Bash, Informatica, Sistemi Operativi.Visto 243 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.
Tags
Apache Bash Elastix Firewall Firma digitale Geolocazione Grafica Informatica Internet Java Linux OpenMoko PHP Programmazione Python Reti Ricetta SEO Sicurezza Sistemi Operativi Varie Virtualizzazione VoIPLink ad altri blog:


