Servizi, servizi, servizi. Un servizio è una parte enorme dell'informatica. Stai leggendo questo articolo su un servizio. Il tuo computer sta eseguendo servizi. Internet ne è pieno.
Informazioni su systemctl
Su Linux, il modo standard per eseguire e gestire i servizi è tramite l'utilità systemd e il comando systemctl
. Il suo utilizzo è abbastanza semplice:devi solo conoscere il nome del servizio che vuoi gestire, quindi puoi utilizzare questo comando per avviare o arrestare il servizio, verificarne lo stato o svolgere altre funzioni:
# systemctl start httpd
# systemctl stop httpd
# systemctl status httpd
File unità
Un servizio è definito in un file chiamato file unit. Si trovano generalmente nella directory /usr/lib/systemd/system
. Ecco un elenco di esempio:
# ls /usr/lib/systemd/system
auditd.service multi-user.target sys-kernel-debug.mount
[email protected] multi-user.target.wants sys-kernel-tracing.mount
basic.target NetworkManager-dispatcher.service syslog.socket
basic.target.wants NetworkManager.service syslog.target.wants
blk-availability.service NetworkManager-wait-online.service
A volte è necessario eseguire più di un'istanza di un servizio su un singolo host. Ad esempio, se gestisci siti web per diversi clienti, le normative di sicurezza richiedono che ogni cliente disponga di una propria istanza individuale. Ciò significa che devi eseguire un nuovo servizio HTTP Apache per ciascuno, ma avere molti servizi può essere difficile da gestire. Se hai 10 clienti diversi, dovresti creare 10 file di unità separati per gestirli. Fortunatamente, esiste un modo migliore per gestire più istanze di un servizio.
Il simbolo @
Si noti che alcuni dei file di unità hanno un simbolo @ nel loro nome. Questo simbolo ha un significato interessante. In effetti, dopo aver installato Apache HTTP Server, potresti notare diversi file di unità di servizio, incluso uno che ha il simbolo @ nel suo nome:[email protected]
.
Ti mostrerò come questo può rendere la vita di un amministratore di sistema un po' più semplice, usando Apache HTTP Server per questo esempio:
# dnf -y install httpd
# cd /usr/lib/systemd/system
# ls -d http*
httpd.service [email protected] httpd.service.d httpd.socket httpd.socket.d
Il simbolo @ indica che verrà effettuata una sostituzione. Systemd prenderà tutto ciò che digiti dopo di esso e sostituirà la variabile %i
all'interno del file dell'unità di servizio. La variabile può essere vista in questo estratto del [email protected]
file:
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:[email protected](8)
[Service]
Type=notify
Environment=LANG=C
Environment=HTTPD_INSTANCE=%i
ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-%i
ExecStartPre=/bin/chown root.apache /run/httpd/instance-%i
ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-%i
ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-%i
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/%i.conf
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful -f conf/%i.conf
Nota che il file di unità httpd predefinito, httpd.service
, non ha il simbolo @ nel nome e ha un aspetto diverso. Viene utilizzato per una singola istanza predefinita di base del server HTTP Apache.
Esegui più istanze
Altro sugli amministratori di sistema
- Abilita blog Sysadmin
- The Automated Enterprise:una guida alla gestione dell'IT con l'automazione
- eBook:Ansible Automation per SysAdmins
- Racconti dal campo:una guida per l'amministratore di sistema all'automazione IT
- eBook:una guida a Kubernetes per SRE e amministratori di sistema
- Ultimi articoli sull'amministratore di sistema
Per eseguire più istanze utilizzando questo file di unità speciale, ognuna necessita di un nome univoco. Supponiamo di avere due clienti, The Little Bank e The Big Bank. Assegna un nome alle istanze littlebank e bigbank. Per gestirne uno basta aggiungerne il nome dopo il simbolo @. Avvia ogni istanza con il comando appropriato:
- littlebank:
systemctl start httpd@littlebank
- bigbank:
systemctl start httpd@bigbank
Tieni presente che la maggior parte dei servizi necessita di determinate configurazioni per evitare conflitti tra istanze diverse. Non li tratterò tutti qui, ma Apache ha bisogno di diverse cose, inclusi numeri di porta di ascolto univoci, file PID e root dei documenti.
Dimostrerò provando ad avviare l'istanza di littlebank. Mi aspetto che fallisca, ma fornirà un utile messaggio di stato:
# systemctl start httpd@littlebank
# systemctl status httpd@littlebank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2020-11-10 11:41:20 EST; 1min 58s ago
Docs: man:[email protected](8)
Process: 2205 ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2207 ExecStartPre=/bin/chown root.apache /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2208 ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2209 ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2210 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/littlebank.conf (code=exited, status=1/FAILURE)
Main PID: 2210 (code=exited, status=1/FAILURE)
CPU: 26ms
Nov 10 11:41:20 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Nov 10 11:41:20 localhost.localdomain httpd[2210]: httpd: Could not open configuration file /etc/httpd/conf/littlebank.conf>
Nov 10 11:41:20 localhost.localdomain systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAIL>
Nov 10 11:41:20 localhost.localdomain systemd[1]: [email protected]: Failed with result 'exit-code'.
Nov 10 11:41:20 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
Puoi vedere che systemd sostituisce correttamente il nome dell'istanza al posto di %i
variabile nel file unit. Tuttavia, Apache non si avvia perché non è stato possibile aprire un file di configurazione. Quindi, ora imposterò le istanze per includere la creazione dei file di configurazione necessari (littlebank.conf
e bigbank.conf
) in /etc/httpd/conf/
:
# ls /etc/httpd/conf
bigbank.conf httpd.conf littlebank.conf
Ora puoi gestire ogni istanza con systemctl
. Emissione start
e status
comandi a ciascuno. Ho ridotto l'output ai dettagli più rilevanti:
# systemctl start httpd@bigbank
# systemctl start httpd@littlebank
# systemctl status httpd@bigbank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:26:06 EST; 56min ago
# systemctl status httpd@littlebank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:25:58 EST; 55min ago
Ecco la visualizzazione del processo di queste istanze. Ce n'è più di uno perché Apache sta eseguendo il fork dei processi del server, cosa che normalmente fa:
# pgrep -a httpd
2834 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2835 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2836 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
3061 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3062 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3064 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
Mettilo in uso
Questa piccola funzionalità di systemd è molto utile quando sono necessarie molte istanze di un servizio. Spero che riuscirai a farne buon uso nel tuo lavoro.