Gestione e creazione di servizi in Debian: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
mNessun oggetto della modifica
(estesa e verificata per Jessie)
Riga 1: Riga 1:
{{Versioni compatibili|Squeeze|Wheezy}}
{{Versioni compatibili|Squeeze|Wheezy|Jessie}}
== Introduzione ==
== Introduzione ==
La maggior parte dei servizi installati su un sistema Debian GNU/Linux viene avviata e fermata tramite un apposito script che si trova sotto la directory <code>/etc/init.d/</code>.<br>
La maggior parte dei servizi installati su un sistema Debian GNU/Linux storicamente viene avviata e fermata tramite un apposito script che si trovava sotto la directory <code>/etc/init.d/</code>. A partire da Debian 8 ([[Jessie]]) questo sistema di init è stato sostituito di default da [[systemd]], che ha una nuova sintassi e nuovi percorsi per i propri file di configurazione, e non richiede più nemmeno l'impiego di script.
Ad esempio, per avviare il servizio MySQL occorre dare (come utente root) questo comando:
 
Systemd è tuttavia in grado di comprenderne la sintassi, purché non ci siano servizi di systemd con lo stesso nome che nasconderebbero gli script presenti in <code>/etc/init.d/</code>, e di eseguirli all'avvio come avveniva in precedenza, secondo le dipendenze indicate in forma di commento nell'intestazione dello script.
 
È possibile inoltre utilizzare il comando <code>service</code>, che si occuperà di invocare <code>systemctl</code> se systemd è attivo oppure di invocare lo script in <code>/etc/init.d/</code> in un ambiente pulito.
 
Ad esempio, per avviare il servizio MySQL, è sufficiente con [[privilegi di amministrazione]] il seguente comando:
<pre>
<pre>
# /etc/init.d/mysql start
# service mysql start
</pre>
</pre>
e per fermare il servizio:
e per fermare il servizio:
<pre>
<pre>
# /etc/init.d/mysql stop
# service mysql stop
</pre>
</pre>


== Come si creano gli script di avvio ==
== Come si creano gli script di avvio ==
Per creare uno script di avvio per un servizio, è sufficiente creare un nuovo file sotto la directory <code>/etc/init.d/</code> e poi editarlo con un qualsiasi editor di testi.<br>
{{Suggerimento | Se si è interessati soltanto a eseguire dei comandi dopo che il sistema e i servizi sono stati avviati, senza lanciare qualcosa che resti in esecuzione, è sufficiente modificare il file <code>/etc/rc.local</code>, aggiungendo lì i propri comandi.}}
 
Per creare uno script di avvio per un servizio, è sufficiente creare un nuovo file sotto la directory <code>/etc/init.d/</code> e poi editarlo con un qualsiasi editor di testi.
 
A partire da Debian 8 ([[Jessie]]), se si utilizza systemd, è necessario accertarsi prima che il nome non sia già utilizzato da un servizio di systemd, altrimenti sarà ignorato:
<pre>$ systemctl status nome-script-da-creare</pre>
Se il nome è libero questo comando restituirà un messaggio di errore che il file non esiste.
 
Ogni script di avvio che si rispetti ha almeno una sezione nella quale controlla i parametri che gli sono stati passati e altre in cui si occupa poi di eseguire un diverso comando a seconda del parametro passato.
Ogni script di avvio che si rispetti ha almeno una sezione nella quale controlla i parametri che gli sono stati passati e altre in cui si occupa poi di eseguire un diverso comando a seconda del parametro passato.
<br>
 
Come per ogni script, anche per questi bisogna indicare nella prima riga l'interprete che deve essere utilizzato per eseguirli, ad esempio:
Come per ogni script, anche per questi bisogna indicare nella prima riga l'interprete che deve essere utilizzato per eseguirli, ad esempio:
<pre>
<pre>
#!/bin/sh
#!/bin/sh
</pre>
</pre>
La selezione del comando da eseguire viene fatta attraverso un semplice <code>case/esac</code> di Bash.<br>
La selezione del comando da eseguire viene fatta attraverso un semplice <code>case/esac</code> di Bash. Un esempio di script è riportato nel listato seguente, che in questo caso è stato scritto nel file <code>/etc/init.d/mio_start_script.sh</code>
Un esempio di script è riportato nel listato seguente:
<pre>
<pre>
#!/bin/bash
#!/bin/bash
Riga 63: Riga 74:
exit 0
exit 0
</pre>
</pre>
Un esempio più semplice di script è il seguente:
 
Lo script andrà poi reso eseguibile con:
<pre>
<pre>
#! /bin/sh
# chmod +x /etc/init.d/mio_start_script.sh
# /etc/init.d/blah
</pre>
#


# Some things that run always
== <code>systemctl</code> ==
touch /var/lock/blah
Con systemd è sufficiente abilitare lo script:
 
<pre>
# Carry out specific functions when asked to by the system
# systemctl mio_start_script.sh enable
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac
 
exit 0
</pre>
</pre>


Riga 94: Riga 89:
Una volta creato lo script bisogna renderlo automatico. Per automatizzare lo start e lo stop di un servizio si possono scegliere 2 strade:
Una volta creato lo script bisogna renderlo automatico. Per automatizzare lo start e lo stop di un servizio si possono scegliere 2 strade:
# si creano i vari link simbolici per stoppare e far partire nelle rispettive directory <code>/etc/rcN.d</code>
# si creano i vari link simbolici per stoppare e far partire nelle rispettive directory <code>/etc/rcN.d</code>
# si utilizza il più comodo comando <code>update-rc.d</code>  
# si utilizza il più comodo comando <code>update-rc.d</code>
Io consiglio fortemente di scegliere la seconda strada.<br>
# si applicano le informazioni sulle dipendenze e i runlevel scritte nell'intestazione, tramite il comando <code>insserv</code>
Innanzitutto rendiamo eseguibile il nostro script:
 
Quest'ultima strada è la migliore, in quanto assicura che l'intestazione sia corretta, mentre gli altri metodi, più manuali, possono avere inconsistenze tra la documentazione e l'applicazione. È anche la più semplice, basta eseguire:
<pre>
<pre>
# chmod +x /etc/init.d/mio_start_script.sh
# insserv
</pre>
</pr>
Quindi diamo il comando:
 
Nel caso si scelga invece la seconda strada, e quindi di discostarsi dall'intestazione dello script, si deve dare il comando:
<pre>
<pre>
# update-rc.d <nome_script_in_init.d> default <priorità_start> <priorità_stop>
# update-rc.d <nome_script_in_init.d> default <priorità_start> <priorità_stop>
Riga 129: Riga 126:


== Eliminazione di un servizio ==
== Eliminazione di un servizio ==
Nel caso in cui il nostro servizio <code>mio_script_start.sh</code> non dovesse più esserci utile dobbiamo rimuoverlo dalla directory init:
Nel caso in cui il nostro servizio <code>mio_script_start.sh</code> non dovesse più esserci utile, dobbiamo disabilitarlo.
 
Con systemd:
<pre>
<pre>
# rm /etc/init.d/mio_script_start.sh
# systemctl disable mio_script_start.sh
</pre>
</pre>
Dobbiamo però eliminare anche i relativi link simbolici (che non avrebbero più effetto), con il comando:
 
Mentre invece, senza systemd, si possono eliminare i relativi link simbolici (che non avrebbero più effetto), con il comando:
<pre>
<pre>
# update-rc.d -f mio_script_start.sh remove
# update-rc.d -f mio_script_start.sh remove
</pre>
Infine, in entrambi i casi, possiamo rimuoverlo dalla directory <code>/etc/init.d</code> con:
<pre>
# rm /etc/init.d/mio_script_start.sh
</pre>
</pre>


{{Autori
{{Autori
|Autore=[[Utente:Ferdybassi|Ferdybassi]]
|Autore=[[Utente:Ferdybassi|Ferdybassi]]
|Estesa_da=
:[[Utente:HAL 9000|HAL 9000]]
|Verificata_da=
:[[Utente:HAL 9000|HAL 9000]] 18:41, 30 mag 2015 (CEST)
|Numero_revisori=1
}}
}}


[[Categoria:Shell]]
[[Categoria:Shell]]
[[Categoria:Ottimizzazione del sistema]]
[[Categoria:Ottimizzazione del sistema]]

Versione delle 16:41, 30 mag 2015

Edit-clear-history.png Attenzione. Questa guida è da considerarsi abbandonata, per via del tempo trascorso dall'ultima verifica.

Potrà essere resa obsoleta, previa segnalazione sul forum, se nessuno si propone per l'adozione.


Debian-swirl.png Versioni Compatibili

Debian 6 "squeeze"
Debian 7 "wheezy"
Debian 8 "jessie"

Introduzione

La maggior parte dei servizi installati su un sistema Debian GNU/Linux storicamente viene avviata e fermata tramite un apposito script che si trovava sotto la directory /etc/init.d/. A partire da Debian 8 (Jessie) questo sistema di init è stato sostituito di default da systemd, che ha una nuova sintassi e nuovi percorsi per i propri file di configurazione, e non richiede più nemmeno l'impiego di script.

Systemd è tuttavia in grado di comprenderne la sintassi, purché non ci siano servizi di systemd con lo stesso nome che nasconderebbero gli script presenti in /etc/init.d/, e di eseguirli all'avvio come avveniva in precedenza, secondo le dipendenze indicate in forma di commento nell'intestazione dello script.

È possibile inoltre utilizzare il comando service, che si occuperà di invocare systemctl se systemd è attivo oppure di invocare lo script in /etc/init.d/ in un ambiente pulito.

Ad esempio, per avviare il servizio MySQL, è sufficiente con privilegi di amministrazione il seguente comando:

# service mysql start

e per fermare il servizio:

# service mysql stop

Come si creano gli script di avvio

Bulb.png Suggerimento
Se si è interessati soltanto a eseguire dei comandi dopo che il sistema e i servizi sono stati avviati, senza lanciare qualcosa che resti in esecuzione, è sufficiente modificare il file /etc/rc.local, aggiungendo lì i propri comandi.


Per creare uno script di avvio per un servizio, è sufficiente creare un nuovo file sotto la directory /etc/init.d/ e poi editarlo con un qualsiasi editor di testi.

A partire da Debian 8 (Jessie), se si utilizza systemd, è necessario accertarsi prima che il nome non sia già utilizzato da un servizio di systemd, altrimenti sarà ignorato:

$ systemctl status nome-script-da-creare

Se il nome è libero questo comando restituirà un messaggio di errore che il file non esiste.

Ogni script di avvio che si rispetti ha almeno una sezione nella quale controlla i parametri che gli sono stati passati e altre in cui si occupa poi di eseguire un diverso comando a seconda del parametro passato.

Come per ogni script, anche per questi bisogna indicare nella prima riga l'interprete che deve essere utilizzato per eseguirli, ad esempio:

#!/bin/sh

La selezione del comando da eseguire viene fatta attraverso un semplice case/esac di Bash. Un esempio di script è riportato nel listato seguente, che in questo caso è stato scritto nel file /etc/init.d/mio_start_script.sh

#!/bin/bash
### BEGIN INIT INFO
# Provides:          mio_start_script.sh
# Required-Start:    hal
# Required-Stop:     
# Should-Start:      
# Should-Stop:       
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Attivazione ottimizzazioni Notebook
# Description:       Attivazione ottimizzazioni Notebook
### END INIT INFO

case "$1" in
start)  echo "Attivo ottimizzazioni Notebook:"

        echo -e "\n1) abilito risparmio energetico per ac97"
        echo 1 > /sys/module/snd_ac97_codec/parameters/power_save

        echo -e "\n\n2) controllo se hdparm è installato correttamente"
        test -f /sbin/hdparm || exit 0

        echo -e "\n2.1) abilito il MultiCount16"
        hdparm -m16 /dev/hde
        echo -e "\n2.2) abilito l'accesso a 32 bit"
        hdparm -c3 /dev/hde
        echo -e "\n2.3) abilito il buffer a 2048"
        hdparm -a2048 /dev/hde
        ;;
stop)   echo "Non ancora implementato"
        ;;
restart) echo "Non ancora implementato"
        ;;
reload|force-reload) echo "Non ancora implementato"
        ;;
*)      echo "Usage: /etc/init.d/mio_start_script.sh {start|stop|restart|reload|force-reload}"
        exit 2
        ;;
esac
exit 0

Lo script andrà poi reso eseguibile con:

# chmod +x /etc/init.d/mio_start_script.sh

systemctl

Con systemd è sufficiente abilitare lo script:

# systemctl mio_start_script.sh enable

update-rc.d

Una volta creato lo script bisogna renderlo automatico. Per automatizzare lo start e lo stop di un servizio si possono scegliere 2 strade:

  1. si creano i vari link simbolici per stoppare e far partire nelle rispettive directory /etc/rcN.d
  2. si utilizza il più comodo comando update-rc.d
  3. si applicano le informazioni sulle dipendenze e i runlevel scritte nell'intestazione, tramite il comando insserv

Quest'ultima strada è la migliore, in quanto assicura che l'intestazione sia corretta, mentre gli altri metodi, più manuali, possono avere inconsistenze tra la documentazione e l'applicazione. È anche la più semplice, basta eseguire:

# insserv
</pr>

Nel caso si scelga invece la seconda strada, e quindi di discostarsi dall'intestazione dello script, si deve dare il comando:
<pre>
# update-rc.d <nome_script_in_init.d> default <priorità_start> <priorità_stop>

dove:

  • <nome_script_in_init.d> nel nostro caso è mio_script_start.sh;
  • <priorità_start> il numero di sequenza che decide l'ordine con cui eseguire lo script quando va avviato;
  • <priorità_stop> il numero di sequenza che decide l'ordine con cui eseguire lo script quando va stoppato.

Ad esempio:

# update-rc.d mio_script_start.sh 10 50

restituisce come output:

Adding system startup for /etc/init.d/mio_script_start.sh ...
/etc/rc0.d/K50mio_script_start.sh -> ../init.d/mio_script_start.sh
/etc/rc1.d/K50mio_script_start.sh -> ../init.d/mio_script_start.sh
/etc/rc6.d/K50mio_script_start.sh -> ../init.d/mio_script_start.sh
/etc/rc2.d/S10mio_script_start.sh -> ../init.d/mio_script_start.sh
/etc/rc3.d/S10mio_script_start.sh -> ../init.d/mio_script_start.sh
/etc/rc4.d/S10mio_script_start.sh -> ../init.d/mio_script_start.sh
/etc/rc5.d/S10mio_script_start.sh -> ../init.d/mio_script_start.sh

Se non volessimo addentrarci nell'argomento priorità di avvio, il mio consiglio è di usare l'opzione defaults; in questo modo sarà la nostra Debian ad assicurarsi che il servizio venga installato nei vari slot di priorità in maniera automatica.

# update-rc.d mio_script_start.sh defaults

Eliminazione di un servizio

Nel caso in cui il nostro servizio mio_script_start.sh non dovesse più esserci utile, dobbiamo disabilitarlo.

Con systemd:

# systemctl disable mio_script_start.sh

Mentre invece, senza systemd, si possono eliminare i relativi link simbolici (che non avrebbero più effetto), con il comando:

# update-rc.d -f mio_script_start.sh remove

Infine, in entrambi i casi, possiamo rimuoverlo dalla directory /etc/init.d con:

# rm /etc/init.d/mio_script_start.sh




Guida scritta da: Ferdybassi Swirl-auth40.png Debianized 40%
Estesa da:
HAL 9000
Verificata da:
HAL 9000 18:41, 30 mag 2015 (CEST)

Verificare ed estendere la guida | Cos'è una guida Debianized