Non l'ho risolto prima, ma sembra che potrebbe essere una buona soluzione per "l'attivazione basata sul percorso".
Invece di avere una clausola "After=" nel tuo file di servizio, dovresti creare un .path
file, come descritto in man systemd.path
.
Trova un file adatto sotto /dev/bus/usb
o /sys/bus/usb
, la cui presenza indica che "USB è attivo". Allora prendi systemd
monitorare il percorso del file utilizzando il .path
file che creerai. Il .path
file attiverebbe quindi il tuo .service
file quando il file esiste.
Quello che farei è creare un'unità di dispositivo systemd usando la regola an udev. Ad esempio:crea /etc/udev/rules.d/20-usb-bus.rules
con:
KERNEL=="usb[1-2]", TAG+="systemd"
Al prossimo avvio (o al ricaricamento delle regole udev) ora avrai la tua unità di dispositivo di sistema:
# systemctl status dev-bus-usb-001-001.device
● dev-bus-usb-001-001.device - 2.0 root hub
...
# systemctl status dev-bus-usb-002-001.device
● dev-bus-usb-002-001.device - 3.0 root hub
...
Ora puoi avviare il tuo servizio dopo che il bus USB è pronto aggiungendo:
[Unit]
...
After=dev-bus-usb-001-001.device dev-bus-usb-002-001.device
al tuo servizio systemd.