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

m
verificata, compatibile per tutte le versioni
m (verificata, compatibile per tutte le versioni)
 
(12 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
[[Categoria:Sistema]]
</pre>
[[Categoria:Server]]
 
{{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:Ottimizzazione del sistema]]
3 581

contributi