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

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
m (verificata, compatibile per tutte le versioni)
 
(11 versioni intermedie di 2 utenti non mostrate)
Riga 1: Riga 1:
{{Versioni compatibili|Tutte le versioni di Debian|}}
{{Versioni compatibili}}
== 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>, 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.
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. 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.
 
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 31: 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 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
== Installare lo script ==
touch /var/lock/blah


# Carry out specific functions when asked to by the system
=== Con <code>systemctl</code> ('''systemd''') ===
case "$1" in
Con systemd è sufficiente abilitare lo script:
  start)
<pre>
    echo "Starting script blah "
# systemctl enable mio_start_script.sh
    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>


== <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)
Io consiglio fortemente di scegliere la seconda strada.<br>
 
Innanzitutto rendiamo eseguibile il nostro script:
Il comando da dare è quindi:
<pre>
# chmod +x /etc/init.d/mio_start_script.sh
</pre>
Quindi diamo 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 123: 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 129: Riga 122:


== 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.
 
Se si utilizza systemd è meglio prima disabilitare il servizio, mentre non è necessario altrimenti:
<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:
 
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>
<br/>
 
<br/>
Infine possiamo rimuovere lo script dalla directory <code>/etc/init.d</code> con:
: [[Utente:Ferdybassi|Ferdybassi]]
<pre>
----
# rm /etc/init.d/mio_script_start.sh
</pre>
 
{{Autori
|Autore=[[Utente:Ferdybassi|Ferdybassi]]
|Estesa_da=
:[[Utente:HAL 9000|HAL 9000]]
|Verificata_da=
:[[Utente:HAL 9000|HAL 9000]] 10:32, 21 lug 2019 (CEST)
|Numero_revisori=1
}}
 
[[Categoria:Shell]]
[[Categoria:Shell]]
[[Categoria:Ottimizzazione del sistema]]
[[Categoria:Ottimizzazione del sistema]]

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