Eseguire Weewx sotto systemd
Introduzione
Se il tuo sistema usa systemd per gestire l'avvio e l'arresto dei demoni, potresti voler configurare Weewx usando un file unit systemd (weewx.service), invece del tradizionale script rc (/etc/init.d/weewx). Sulla maggior parte dei sistemi con systemd, lo script Weewx rc funzionerà ancora, ma il file unit systemd ha una serie di vantaggi:
- È più semplice da eseguire come utente non root;
- Le dipendenze, in particolare sulla sincronizzazione dell'ora, sono specificate più facilmente;
- Uno stile più dichiarativo, che semplifica gli script.
L'installazione consiste in tre passaggi.
- Pulisci tutti i vecchi rcscript.
- Installa il file unit weewx.service
- Abilita ed eseguire il file unit.
Pulire i vecchi Rcscript
-
Interrompi tutte le istanze weewxd in esecuzione che utilizzano gli script rc:
sudo /etc/init.d/weewx stop
-
Se esiste, sbarazzati del tuo vecchio script /etc/init.d
sudo rm /etc/init.d/weewx
Installare il file unit weewx.service
Weewx offre un file "unit" systemd chiamato weewx.service, che dice a systemd come eseguire Weewx. Il modo in cui lo installi dipende dal fatto che tu abbia utilizzato il setup.py o un programma di installazione del pacchetto. C'è anche la possibilità di eseguire più istanze (weewx-multi) sotto systemd, per le quali la configurazione è descritta di seguito
Il file unit ha un aspetto simile a questo:
# systemd unit configuration file for Weewx # # For information about running Weewx under systemd, # be sure to read https://github.com/weewx/weewx/wiki/systemd # [Unit] Description=Weewx weather system Documentation=https://weewx.com/docs Requires=time-sync.target After=time-sync.target RequiresMountsFor=/home [Service] ExecStart=/home/weewx/bin/weewxd /home/weewx/weewx.conf StandardOutput=null # To run as a non-root user, uncomment and set username and group here: #User=weewx #Group=weewx WantedBy=multi-user.target
Per installazioni con setup.py
Le installazioni setup.py includono una copia del file di servizio. Copialo nella posizione:
sudo cp /home/weewx/util/systemd/weewx.service /etc/systemd/system
Dai un'occhiata e assicurati che la riga che inizia con ExecStart corrisponda alla tua installazione. L'impostazione predefinita è
ExecStart=/home/weewx/bin/weewxd /home/weewx/weewx.conf
che dovrebbe funzionare per la maggior parte dei casi.
Per installazioni con pacchetti Debian
Se hai installato utilizzando un programma di installazione dei pacchetti Debian, la distribuzione non include una copia di weewx.service. Dovrai scaricarlo:
cd /etc/systemd/system sudo wget https://raw.githubusercontent.com/weewx/weewx/master/util/systemd/weewx.service
Esamina il file e modifica la riga che inizia con ExecStart in modo che corrisponda alla tua installazione. Probabilmente finirà per assomigliare a questo:
ExecStart=/usr/bin/weewxd /etc/weewx/weewx.conf
Abilitazione e funzionamento
Ora che il file unit è in posizione, è il momento di abilitarlo. Queste istruzioni sono le stesse indipendentemente da come hai installato Weewx.
-
Innanzitutto, tieni presente che il file unit ha una dipendenza da time-sync.target. Ciò garantisce che weewxd non venga eseguito prima dell'avvio di un servizio di sincronizzazione dell'ora. Tuttavia, non garantisce che l'ora sia stata effettivamente sincronizzata, solo che sia stato avviato un servizio orario! Per garantire che l'ora sia stata effettivamente sincronizzata, utilizzare questo comando:
sudo systemctl enable --now systemd-time-wait-sync.service
Questo servizio non terminerà finché l'ora non sarà stata sincronizzata.
-
Dovrai quindi abilitare il tuo file unit di Weewx, che assicura venga eseguito durante l'avvio del sistema:
sudo systemctl enable weewx
-
Infine, avvia weewx:
sudo systemctl start weewx
Avvio e arresto di weewxd
Per avviare weewxd:
sudo systemctl start weewx
Per interrompere weewxd:
sudo systemctl stop weewx
Per verificarne lo stato:
sudo systemctl status weewx
Se vuoi impedire l'avvio di weewxd all'avvio del sistema, disabilitalo in questo modo:
sudo systemctl disable weewx
Successivamente, puoi riattivarlo:
sudo systemctl enable weewx
Che sia abilitato o disabilitato, puoi comunque avviare/arrestare.
Da eseguire come utente non root
Sarà necessario decommentare le righe nella sezione [Service] del file weewx.service, dove fa riferimento a User= e Group=. Aggiungi il nome dell'utente che desideri eseguire. Ad esempio, per essere eseguito come utente weewx sarebbe simile a questo (assumendo sia il metodo di installazione setup.py):
[Service] ExecStart=/home/weewx/bin/weewxd /home/weewx/weewx.conf StandardOutput=null User=weewx Group=weewx
Assicurati che qualunque utente tu scelga disponga delle seguenti autorizzazioni:
- • Autorizzazione a scrivere nel database weewx (se si utilizza sqlite);
- • Autorizzazione a scrivere nella posizione per i file dei report weewx (HTML);
- • Autorizzazione ad accedere alla porta USB a cui è connesso il tuo dispositivo.
Per l'ultimo elemento, potresti dover scrivere una regola udev. Ecco uno schema di come farlo. Per prima cosa trova l'idVendor e l'idProduct della tua stazione meteorologica usando il comando lsusb. Per esempio:
/home/weewx$ lsusb Bus 001 Device 002: ID 8087:8000 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 002 Device 005: ID 8087:07dc Intel Corp. Bluetooth wireless interface Bus 002 Device 003: ID 10c4:ea60 Silicon Labs CP210x UART Bridge Bus 002 Device 004: ID 413c:2010 Dell Computer Corp. Keyboard Bus 002 Device 002: ID 413c:1003 Dell Computer Corp. Keyboard Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Da questo, possiamo identificare che la stazione si trova sul Bus 2, Dispositivo 5. L'ID fornitore è 10c4 e l'ID prodotto è ea60.
Crea un file di regole chiamato /etc/udev/rules.d/weewx.rules e includi questo contenuto:
SUBSYSTEM=="usb", ATTR{idVendor}=="10c4", ATTR{idProduct}=="ea60", ACTION=="add", GROUP="weewx", MODE="0664"
Naturalmente, è probabile che i tuoi identificatori idVendor e idProduct siano diversi. Regola se necessario.
Ora, quando la tua stazione viene collegata alla porta USB, questa regola la identificherà. Impostare quindi la proprietà del gruppo su weewx, con privilegi di lettura/scrittura 0664, consentendo all'utente weewx di accedervi.
Systemd multi istanze
Le modifiche necessarie per eseguire ciò che il gergo di systemd chiama servizi istanziati sono abbastanza semplici. Gli esempi qui sono basati sul semplice file unit sopra e sulle configurazioni di esempio sulla pagina weewx-multi.
- Inizia con gli stessi file .conf descritti nella pagina (weewx-multi).
- Non sono richieste modifiche a /etc/default/weewx e non è necessario /etc/default/weewx-multi
- Individua il tuo attuale file unit weewx weewx.service (di solito /etc/systemd/system o /lib/systemd/system) e creane una copia denominata weewx@.service in /etc/systemd/system.
- Modifica il file weewx@.service e inserisci un "%i" nelle posizioni in cui devono apparire gli identificatori house o paddock. Ad esempio, all'inizio, rendi unica ogni descrizione
Description=Weewx weather system located in the %i
Nella riga che esegue il demone potresti usare:
ExecStart=/home/weewx/bin/weewxd --log-label weewx-%i /home/weewx/%i.conf
Se il tuo file unit definisce un file pid, dovrai modificare anche quello, in modo che ogni istanza abbia un file con un nome univoco, qualcosa del genere: weewx-%i.pid
Attivazione dei servizi
I soliti comandi vengono modificati aggiungendo l'identificatore di istanza al nome dell'unità, in modo che weewx diventi weewx@house ad esempio.
systemctl stop weewx systemctl disable weewx systemctl start weewx@house systemctl start weewx@paddock systemctl status weewx@\*
Il formato con caratteri jolly della richiesta di stato mostra entrambe le istanze.
Quando tutto sembra funzionare, configurali per l'avvio automatico:
systemctl enable weewx@house systemctl enable weewx@paddock
Pulizia
Dopo che tutto ha funzionato, sarebbe una buona idea riconfigurare il file weewx.conf originale al simulatore. In questo modo, se il singolo servizio weewx viene riavviato inaspettatamente, non ci saranno più istanze che tenteranno di accedere allo stesso database. Il seguente comando aiuterà anche a evitare potenziali problemi:
systemctl mask weewx