Come eseguire un server python come servizio
In questo breve post vedremo come startare un programma in python come servizio.
Supponiamo di avere scritto il nostro programma nel file test.py.
Per avviarlo come servizio in background, nella directory system scriviamo il file test.service che identificherà e avvierà il nostro file come servizio
sudo nano /etc/systemd/system/test.service
Inseriamo nel file i seguenti comandi:
[Unit] Description=descrizione del servizio After=multi-user.target [Service] Type=simple Restart=always ExecStart=/usr/bin/python3 /home/<username>/test.py [Install] WantedBy=multi-user.target
Naturalmente occorrerà sostituire <username> con il nome utente con cui ci si è loggati.
Restart=always assicura che il servizio sia riavviato ad ogni riavvio della macchina. ExecStart accoglie il comando da eseguire come servizio. Nel nostro caso si tratta del file test.py scritto e da avviare con python3.
multi-user.target normalmente definisce uno stato del sistema in cui tutti i servizi di rete vengono avviati e il sistema accetterà gli accessi, ma non viene avviata una GUI locale. Questo è lo stato di sistema predefinito tipico per i sistemi server. In altre parole l’istruzione WantedBy=multi-user.target dice a systemd che questo servizio deve essere avviato come parte del normale avvio del sistema, indipendentemente dal fatto che sia attiva o meno una GUI locale.
Salviamo e chiudiamo il file e effettuiamo il reload del daemon con sudo systemctl daemon-reload
Abilitiamo il servizio con sudo systemctl enable test.service
Infine effettuaiamone lo start con sudo systemctl start test.service
Altri comandi utili sono:
per il restart sudo systemctl restart test.py
per lo stop sudo systemctl stop test.py
per conoscere lo stato del servizio sudo systemctl status test.py
Ci sono delle funzioni che permettono di vedere gli stati del servizio. Ad esempio il seguente comando permette di verificare se il servizio è attivo.
systemctl is-active test.py
In ogni caso già il comando “status” fornisce quasi tutte le informazioni necessarie.
Il seguente comando fornisce la lista di tutti i servizi attivi.
systemctl list-units
Possiamo anche filtrare la lista per stati. Il seguente comando restituisce solo i servizi inattivi.
systemctl list-units --all --state=inactive
NB: in realtà quanto scritto vale per qualunque linguaggio di programmazione.
Possiamo trovare maggiori informazioni e una lista dei comandi completa qui.