Perché non basta un semplice script in background
Avviare un programma con & alla fine del comando (per mandarlo in background) o con nohup è una soluzione rapida ma fragile: il processo non riparte automaticamente al riavvio del server, non viene riavviato se va in crash, e non c'è un modo standard per vederne lo stato, i log o fermarlo in modo pulito. Per un programma che deve funzionare in modo affidabile su un server, la soluzione corretta è registrarlo come servizio systemd, il gestore di servizi ormai standard sulla stragrande maggioranza delle distribuzioni Linux moderne.
Il file unit
Un servizio systemd si definisce con un semplice file di testo, detto unit file, salvato tipicamente in /etc/systemd/system/nomeapp.service. La struttura minima prevede tre sezioni: [Unit], con una descrizione e le eventuali dipendenze da altri servizi (ad esempio "avviami solo dopo che la rete è disponibile"); [Service], dove si specifica il comando da eseguire (ExecStart), l'utente con cui eseguirlo e la politica di riavvio automatico in caso di crash (Restart=on-failure); [Install], che definisce in quale fase del boot il servizio deve essere attivato.
Attivare e gestire il servizio
Dopo aver creato il file, il servizio va registrato con systemctl daemon-reload (per far rileggere a systemd i file unit disponibili), avviato con systemctl start nomeapp e, per farlo partire automaticamente ad ogni riavvio del server, abilitato con systemctl enable nomeapp. Lo stato corrente si controlla in qualsiasi momento con systemctl status nomeapp, che mostra se il servizio è attivo, da quanto tempo, e le ultime righe di log generate.
I log centralizzati con journalctl
Un vantaggio pratico di systemd è che l'output del programma (sia lo standard output che gli errori) viene raccolto automaticamente dal journal di sistema, consultabile con il comando journalctl -u nomeapp, senza dover configurare manualmente file di log separati o preoccuparsi della loro rotazione: systemd se ne occupa in modo trasparente.
Il riavvio automatico in caso di crash
L'opzione Restart=on-failure nella sezione [Service] fa sì che, se il programma termina in modo anomalo, systemd lo riavvii automaticamente dopo un breve intervallo, senza intervento manuale: una rete di sicurezza semplice ma efficace per servizi che devono restare disponibili senza supervisione costante, come un piccolo server web interno o un'applicazione di raccolta dati da sensori periferici.