Gestione e creazione di servizi in Debian: differenze tra le versioni
Nessun oggetto della modifica |
m (verificata, compatibile per tutte le versioni) |
||
(17 versioni intermedie di 4 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Versioni compatibili | {{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 | 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 | |||
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> | ||
# service mysql start | |||
</pre> | </pre> | ||
e per fermare il servizio | e per fermare il servizio: | ||
<pre> | <pre> | ||
# 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 < | {{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. | ||
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. | 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: | # 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> | ||
Lo script andrà poi reso eseguibile con: | |||
<pre> | <pre> | ||
# chmod +x /etc/init.d/mio_start_script.sh | # chmod +x /etc/init.d/mio_start_script.sh | ||
</pre> | </pre> | ||
== 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 95: | 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 | 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 < | == 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> | ||
# | # systemctl disable mio_script_start.sh | ||
</pre> | </pre> | ||
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 possiamo rimuovere lo script dalla directory <code>/etc/init.d</code> con: | ||
<pre> | |||
# rm /etc/init.d/mio_script_start.sh | |||
[[Categoria: | </pre> | ||
[[Categoria: | |||
{{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]] |
Versione attuale delle 08:32, 21 lug 2019
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
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:
- 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
, che è la forma consigliata (in caso si utilizzisystemctl
, 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 | Debianized 40% |
Estesa da: | |
Verificata da:
| |
Verificare ed estendere la guida | Cos'è una guida Debianized |