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

m
verificata, compatibile per tutte le versioni
Nessun oggetto della modifica
m (verificata, compatibile per tutte le versioni)
 
(18 versioni intermedie di 4 utenti non mostrate)
Riga 1: Riga 1:
=Versioni compatibili=
{{Versioni compatibili}}
* Debian Sarge 3.0
== Introduzione ==
* Debian Etch 4.0
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.
* Debian Lenny 5.0
 
* Debian Squeeze 6.0
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.
=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 <tt>/etc/init.d/</tt>.<br>
È 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 occorre dare (come utente root) questo comando:
 
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 <tt>/etc/init.d/</tt> 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 case/esac 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 35: 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 67: Riga 74:
exit 0
exit 0
</pre>
</pre>
=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:
Lo script andrà poi reso eseguibile con:
# si creano i vari link simbolici per stoppare e far partire nelle rispettive directory /etc/rcN.d
# si utilizza il più comodo comando update-rc.d
Io consiglio fortemente di scegliere la seconda strada.<br>
Innanzitutto rendiamo eseguibile il nostro script:
<pre>
<pre>
# chmod +x /etc/init.d/mio_start_script.sh
# chmod +x /etc/init.d/mio_start_script.sh
</pre>
</pre>
Quindi diamo il comando:
 
== Installare lo script ==
 
=== Con <code>systemctl</code> ('''systemd''') ===
Con systemd è sufficiente abilitare lo script:
<pre>
# systemctl enable mio_start_script.sh
</pre>
 
=== 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:
# 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>, che è la forma consigliata (in caso si utilizzi <code>systemctl</code>, verrà sempre invocato questo 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>
</pre>
</pre>
dove:
dove:
* <nome_script_in_init.d> nel nostro caso è mio_script_start.sh
* <code><nome_script_in_init.d></code> nel nostro caso è <code>mio_script_start.sh</code>;
* <priorità_start> il numero di sequenza che decide l'ordine con cui eseguire lo script quando va avviato
* <code><priorità_start></code> 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  
* <code><priorità_stop></code> il numero di sequenza che decide l'ordine con cui eseguire lo script quando va stoppato.
Ad esempio:
Ad esempio:
<pre>
<pre>
Riga 99: 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 sull'argomento priorità di avvio, il mio consiglio è di usare l'opzione "defaults"; in questo modo sarà la nostra Debian ada 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
</pre>
</pre>
=Eliminazione di un servizio=
 
Nel caso in cui il nostro servizio <tt>mio_script_start.sh</tt> non dovesse più esserci utile dobbiamo rimuoverlo dalla directory init:
== Eliminazione di un servizio ==
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