GNU/Linux >> Linux Esercitazione >  >> Linux

Gestisci più istanze del servizio con systemctl

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.


Linux
  1. Eseguire vere istanze di processo multiple di Gnome-terminal?

  2. Comandi del servizio di base

  3. systemctl:comando non trovato

  4. Esempi di comandi systemctl in Linux

  5. systemd - Dando al mio servizio più argomenti

Installa più istanze Drupal con Nginx su Ubuntu 20.04

Comandi Systemctl per gestire il servizio Systemd

Come gestire più versioni Java con jEnv su Linux

Gestire cgroup con systemd

Iniziare con systemctl

Come usare systemctl in Linux