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

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
(estesa e verificata per Jessie)
m (verificata, compatibile per tutte le versioni)
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
{{Versioni compatibili|Squeeze|Wheezy|Jessie}}
{{Versioni compatibili}}
== Introduzione ==
== 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 <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.
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>, tramite il sistema di init [[SysV]]. A partire da Debian 8 ([[Jessie]]) questo sistema è 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 <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.
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.
Riga 17: Riga 17:


== Come si creano gli script di avvio ==
== Come si creano gli script di avvio ==
{{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.}}
{{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. Il file andrà creato se non esiste, e reso eseguibile.}}


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.
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.
Riga 42: Riga 42:
# Default-Start:    2 3 4 5
# Default-Start:    2 3 4 5
# Default-Stop:      0 1 6
# Default-Stop:      0 1 6
# Short-Description: Attivazione ottimizzazioni Notebook
# Short-Description: Ottimizzazioni Notebook
# Description:      Attivazione ottimizzazioni Notebook
# Description:      Attivazione ottimizzazioni Notebook personalizzate
### END INIT INFO
### END INIT INFO


Riga 80: Riga 80:
</pre>
</pre>


== <code>systemctl</code> ==
== Installare lo script ==
 
=== Con <code>systemctl</code> ('''systemd''') ===
Con systemd è sufficiente abilitare lo script:
Con systemd è sufficiente abilitare lo script:
<pre>
<pre>
# systemctl mio_start_script.sh enable
# systemctl enable mio_start_script.sh
</pre>
</pre>


== <code>update-rc.d</code> ==
=== Con <code>update-rc.d</code> ===
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>, che è la forma consigliata (in caso si utilizzi <code>systemctl</code>, verrà sempre invocato questo comando)
# si applicano le informazioni sulle dipendenze e i runlevel scritte nell'intestazione, tramite il comando <code>insserv</code>
 
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>
# insserv
</pr>


Nel caso si scelga invece la seconda strada, e quindi di discostarsi dall'intestazione dello script, si deve dare il comando:
Il comando da dare è quindi:
<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 120: Riga 116:
/etc/rc5.d/S10mio_script_start.sh -> ../init.d/mio_script_start.sh
/etc/rc5.d/S10mio_script_start.sh -> ../init.d/mio_script_start.sh
</pre>
</pre>
Se non volessimo addentrarci nell'argomento priorità di avvio, il mio consiglio è di usare l'opzione <code>defaults</code>; in questo modo sarà la nostra Debian ad assicurarsi che il servizio venga installato nei vari slot di priorità in maniera automatica.
Se non volessimo addentrarci nell'argomento priorità di avvio, il mio consiglio è di usare l'opzione <code>defaults</code>; in questo modo sarà la nostra Debian ad assicurarsi che il servizio venga installato nei vari slot di priorità in maniera automatica, in base a quanto configurato nell'intestazione dello script.
<pre>
<pre>
# update-rc.d mio_script_start.sh defaults
# update-rc.d mio_script_start.sh defaults
Riga 128: Riga 124:
Nel caso in cui il nostro servizio <code>mio_script_start.sh</code> non dovesse più esserci utile, dobbiamo disabilitarlo.  
Nel caso in cui il nostro servizio <code>mio_script_start.sh</code> non dovesse più esserci utile, dobbiamo disabilitarlo.  


Con systemd:
Se si utilizza systemd è meglio prima disabilitare il servizio, mentre non è necessario altrimenti:
<pre>
<pre>
# systemctl disable mio_script_start.sh
# systemctl disable mio_script_start.sh
</pre>
</pre>


Mentre invece, senza systemd, si possono eliminare i relativi link simbolici (che non avrebbero più effetto), con il comando:
Sia con systemd sia senza, per eliminare i relativi link simbolici (che non avrebbero più effetto) creati nelle cartelle <code>/etc/rc?.d/</code>, si può usare il comando:
<pre>
<pre>
# update-rc.d -f mio_script_start.sh remove
# update-rc.d -f mio_script_start.sh remove
</pre>
</pre>


Infine, in entrambi i casi, possiamo rimuoverlo dalla directory <code>/etc/init.d</code> con:
Infine possiamo rimuovere lo script dalla directory <code>/etc/init.d</code> con:
<pre>
<pre>
# rm /etc/init.d/mio_script_start.sh
# rm /etc/init.d/mio_script_start.sh
Riga 148: Riga 144:
:[[Utente:HAL 9000|HAL 9000]]
:[[Utente:HAL 9000|HAL 9000]]
|Verificata_da=
|Verificata_da=
:[[Utente:HAL 9000|HAL 9000]] 18:41, 30 mag 2015 (CEST)
:[[Utente:HAL 9000|HAL 9000]] 10:32, 21 lug 2019 (CEST)
|Numero_revisori=1
|Numero_revisori=1
}}
}}

Versione attuale delle 08:32, 21 lug 2019

Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian

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/, tramite il sistema di init SysV. A partire da Debian 8 (Jessie) questo sistema è 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. Il file andrà creato se non esiste, e reso eseguibile.


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: Ottimizzazioni Notebook
# Description:       Attivazione ottimizzazioni Notebook personalizzate
### 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

Installare lo script

Con systemctl (systemd)

Con systemd è sufficiente abilitare lo script:

# systemctl enable mio_start_script.sh

Con 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, che è la forma consigliata (in caso si utilizzi systemctl, verrà sempre invocato questo comando)

Il comando da dare è quindi:

# 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, in base a quanto configurato nell'intestazione dello script.

# 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.

Se si utilizza systemd è meglio prima disabilitare il servizio, mentre non è necessario altrimenti:

# systemctl disable mio_script_start.sh

Sia con systemd sia senza, per eliminare i relativi link simbolici (che non avrebbero più effetto) creati nelle cartelle /etc/rc?.d/, si può usare il comando:

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

Infine possiamo rimuovere lo script 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 10:32, 21 lug 2019 (CEST)

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