SystemD Unit File Creazione di un servizio

SystemD Unit File Creazione di un servizio
La gestione del servizio è qualcosa a cui non pensi nemmeno quando usi la tua workstation Linux o il server Linux ogni giorno, ma quando non è lì lo odierai davvero. Quando crei ad esempio un nuovo programma di server che deve essere eseguito 24 ore su 24, 7 giorni su 7, fare questa sfida senza la gestione del servizio è un incubo in cui si crea in realtà un piccolo sistema di servizio, che ovviamente non sarà buono come il manager sviluppato da un squadra completa durante anni, comunque.

Con i suoi servizi, SystemD rende tutto questo più semplice, davvero più semplice. Non appena vuoi qualcosa di monitorare la tua applicazione e un facile controllo, SystemD è la strada da percorrere, ed è quello che spiegherò qui!

Dove sono i servizi SystemD

Per aggiungere un nuovo servizio, beh, devi rispondere a questa domanda. Come sempre in SystemD, dipende se il servizio è solo per l'utente o per l'intero sistema. Ci concentreremo su come SystemD funziona per l'intero sistema di sistema.

La posizione esatta dipende dal perché e da come il servizio è stato installato. Se il servizio è installato da un gestore di pacchetti, sarà generalmente in/usr/lib/systemd/system. Per il software che sviluppi o quelli che non supportano SystemD da solo, inserirai il file di servizio in/usr/locale/lib/systemd/system. Tieni presente che alcune distribuzioni non supportano questa cartella in /usr /locale. Infine, se si desidera configurare un servizio SystemD esistente,/etc/systemd/system è la strada da percorrere.

All'interno di queste cartelle è possibile trovare più estensioni di file come *.PRESA, *.Target o *.servizio. Ovviamente ci concentreremo sull'ultimo. SystemD utilizza il nome file come nome del servizio quando lo si avvia o lo si interrompe ecc. Quindi generalmente i nomi di file in servizio contiene solo caratteri alfanumerici insieme a trattini e sottolinei. Durante lo sviluppo ti consiglio di crearlo nei tuoi documenti e quindi copiarlo nella posizione Systemd quando è finito, ciò ti eviterebbe i problemi se risparmiete in mezzo alla modifica.

OK, quindi crea il tuo file di servizio nei tuoi documenti. Ora siamo pronti a rivedere come scrivere questo file.
[Nota: vedere potenziale report di bug nella sezione commenti di questo post sul blog]

[Unità]
Descrizione = Applicazione Web Penguins Server HTTP (in esecuzione nella porta 8080)
WANTEDBY = Multi-utente.bersaglio
[Servizio]
Tipo = semplice
ExecStart =/usr/bin/python3/usr/local/bin/pinguin-web-app/main.Py
Riavvia = sempre

Il formato del file è in realtà vicino a ini. So che potrebbe essere strano dato che i file Ini si trovano spesso in Windows, ma è così che funziona. Il file di servizio è diviso per la prima volta in 2 sezioni: [unità] e [servizio]. Ogni sezione configura un aspetto specifico di SystemD: [unità] contiene elementi condivisi da tutti i file di unità di sistema mentre [servizio] è solo per la configurazione specifica per l'impostazione di un nuovo servizio.

Quindi la sezione è configurata con proprietà come Descrizione = o ExecStart =. Il valore è separato dal nome della proprietà dal segno uguale = senza spazio.

Torniamo al file mostrato sopra. Descrive un servizio progettato per eseguire un'app Web scritta in Python sui pinguini. SystemD lo riavvierà ogni volta che il processo esce e avvia il server sull'avvio del server se lo si abilita con il comando abilita SystemCtl. Cool eh?

Ma forse sei la tua prossima app web non riguarda i pinguini - E questo è un peccato - E non è scritto in Python. In questo caso vorrai saperne di più sulle possibili configurazioni.

Proprietà dei servizi di sistema

Concentriamoci prima sulle proprietà in [unità]:

Descrizione = consiste solo nel dare una chiara descrizione di ciò che il servizio sta facendo. Viene visualizzato nell'elenco dei servizi, nei registri di servizio in modo che tu voglia che sia descrittivo ma dovrebbe rimanere in una riga e una frase.

WANTEDBY = permette di dire a SystemD: quando questa cosa è iniziata, inizia anche a me. Generalmente metterai il nome di un bersaglio. Esempi di obiettivi comuni:

  1. multiutente.Target: quando il server è OK ed è pronto per eseguire le applicazioni della riga di comando
  2. grafico.Target: quando Gnome o KDE sono pronti
  3. Network-up.Target: quando il server è connesso correttamente a una rete

Ok per l'inizio queste proprietà di [unità] sono sufficienti. Diamo un'occhiata al [servizio] ora.

Type = aiuta il sistema in modo da sapere se un servizio è in esecuzione. Ecco i tipi comuni:

  1. Simple è probabilmente il più comunemente usato: SystemD considera il processo avviato come quello che fa il servizio. Se il processo si interrompe, considera anche il servizio interrotto, ecc.
  2. La bottiglia è preferita per le applicazioni scritte per essere un server ma senza l'aiuto di un sistema di gestione del servizio. Fondamentalmente si aspetta che il processo lanciato da forchetta e quella forcella sia considerata il processo finale per il servizio. Per essere più accurato, puoi anche aiutare SystemD con un file PID, in cui il PID del processo da tracciare è scritto dall'applicazione lanciata.

ExecStart = è probabilmente il più importante per un servizio: precise quale applicazione si avvia quando si avvia il servizio. Come puoi vedere nel servizio Penguin, ho usato/bin/bin/python3 e non python3. È perché la documentazione di SystemD raccomanda esplicitamente di utilizzare percorsi assoluti per evitare qualsiasi sorpresa.

Ma questo è anche per un altro motivo. Il sistema di gestione di altri servizi tende a basarsi sugli script di shell. Tuttavia SystemD, per le prestazioni, non esegue una shell per impostazione predefinita. Quindi non è possibile fornire direttamente un comando shell in ExecStart =. È comunque possibile utilizzare ancora uno script di shell facendo:

ExecStart =/usr/bin/bash/usr/local/bin/lancio-pinguino-server.sh

Non è così difficile bene? Si noti che se è necessario eseguire un processo per segnalare il tuo servizio per interrompere in modo pulito, esiste ExecStop =.

Restart = ti consente di dire esplicitamente quando il servizio deve essere riavviato. Questa è una delle caratteristiche importanti di SystemD: assicura che il tuo servizio rimanga sveglio tutto il tempo che lo desideri, quindi presta molta attenzione a questa opzione.

Riavvia = Senso
Sempre SystemD continuerà a riavviarlo ogni volta che termina o si blocca. Bene, fino a quando non esegui SystemCtl Stop Service-Name.servizio.

È perfetto per i server e i servizi online in quanto preferisci pochi riavviati inutili sulla necessità di riavviare manualmente il servizio senza alcun motivo.

On-Armal Quando il processo di servizio si blocca, riavvia il servizio. Tuttavia, se l'applicazione esce in modo pulito, non riavviarla.

È più utile per i servizi cron come i servizi che devono svolgere un'attività in modo affidabile ma non è necessario eseguire tutto il tempo.

on-failure Proprio come on-abnormal, ma riavvia anche il servizio quando l'applicazione esce in modo pulito ma con un codice di uscita diverso da zero. I codici di uscita diversi da zero generalmente significa che si è verificato un errore.
NO SystemD non riavvierà automaticamente il servizio.

Generalmente utile per ottenere l'accesso ad altre funzionalità SystemD come la registrazione senza la funzione di riavvio.

WorkingDirectory = può applicare una directory di lavoro durante l'avvio dell'applicazione. Il valore deve essere un percorso di directory assoluto. La directory di lavoro viene utilizzata quando si utilizzano percorsi relativi nel codice dell'applicazione. Per il nostro servizio Penguins, potrebbe essere:

WorkingDirectory =/srv/pinguin-web-app/

Quindi, la sicurezza è importante, quindi in genere si desidera non avviare il tuo servizio con i privilegi di root. User = e group = consente di impostare il nome dell'utente o del gruppo o UID/GID in base al quale verrà lanciata l'applicazione. Per esempio:

Utente = Penguin-Web
Gruppo = Penguin-Web

EnvironmentFile = è un'opzione potente. Le applicazioni in esecuzione come servizi spesso richiedono i file di configurazione e ambiente consentono di impostare tale configurazione in due modi:

  1. L'applicazione può leggere direttamente la variabile di ambiente.
  2. Ma puoi anche impostare argomenti di riga di comando diversi sull'applicazione senza modificare il file di servizio.

La sintassi di questo file è semplice: digitare il nome della variabile ambientale, il segno uguale = e quindi il suo valore. Quindi metti il ​​percorso assoluto del tuo file ambientale nella proprietà ambientale.

Quindi esempio:

EnvironmentFile =/etc/pinguino-web-app/ambiente

E il file/etc/pinguin-web-app/ambiente contiene:

Ascolt_port = 8080

Quindi la nostra app Web Penguins avrà accesso alla variabile dell'ambiente di ascolto e ascolta la porta prevista.

Salva e avvia il servizio Systemd di recente creazione

Quindi, se hai seguito il mio consiglio, hai modificato il tuo file di servizio nella tua home directory. Una volta che sei soddisfatto, copia quel file su/usr/local/lib/systemd/system, supponendo che la distribuzione supporti quel percorso. Il nome file del tuo file di servizio sarà il suo nome di servizio. Questo nome file deve finire con .servizio. Ad esempio, per il nostro server Penguins, sarebbe Penguin-Web-app.servizio.

Quindi, devi dire a SystemD che hai aggiunto un nuovo servizio, quindi devi digitare questo comando:

$ sudo systemctl demone-ricaricamento

Ok ora systemd è a conoscenza del tuo nuovo servizio, supponendo che il tuo file non contenga un errore di sintassi. Dopotutto, è il tuo primo file, quindi è probabile che commetterai errori. Devi eseguire questo comando sopra su ogni aggiornamento nel tuo file di servizio.

Ora, è ora di iniziare il servizio:

$ sudo systemctl avvia pinguino-web-app.servizio

Se fallisce con un'unità non trovata un errore come questo:

$ sudo systemctl avvia pinguino-web-app.servizio
Impossibile iniziare Penguin-Web-app.Servizio: unità non trovata.

Significa che la tua distribuzione non supporta la directory o non hai nominato correttamente il file di servizio. Assicurati di controllare.

Se imposti il ​​tuo servizio con Wantedby = e desidera che il tuo servizio inizi automaticamente, devi abilitarlo, con questo comando:

$ sudo systemctl abilita pinguino-web-app.servizio

La cosa interessante con un servizio è che funziona in background. Il problema: come sapere se funziona correttamente e se è in esecuzione se funziona in background? Non preoccuparti, anche il team di Systemd ci ha pensato e ha fornito un comando per vedere se funziona correttamente, dal momento che tempo, ecc

$ SYSTEMCTL STATO PEGGUIN-WEB-APP.servizio

Conclusione

congratulazioni! Ora puoi gestire le tue applicazioni senza che tu ti preoccupi di riavviarle manualmente ogni volta. Ora, ti consiglio di leggere il nostro altro articolo sui registri SystemD: Master JournalCtl: Comprendi i registri Systemd. Con ciò puoi utilizzare il potente sistema di registrazione sul tuo nuovo servizio e creare server più affidabili!