Bonjour la Guilde !
J'ai un problème que j'essaye de résoudre avec systemd, mais je m'y
perds dans la doc. :-( Peut-être quelqu'un ici peut m'aider ? Peut-être
que systemd n'est pas le bon outil pour ce que je veux faire ?
J'ai un instrument qui se pilote via une liaison série émulée sur USB
(il a un FTDI dedans), et un Raspberry avec un script qui accède à cet
instrument. Je voudrais que ce script tourne si et seulement si
l'instrument est branché. Le script doit donc être :
– lancé au démarrage si l'instrument est déjà branché
– tué quand l'instrument est débranché
– (re)lancé quand l'instrument est (re)branché
Je me suis dit que systemd, sur le papier du moins, semblait être
l'outil ad doc pour gérer le cycle de vie d'un tel script. J'ai essayé
d'en faire un service conditionné par l'existence d'un fichier :
/usr/local/bin/rem_pulser.sh (le script en question):
#!/bin/bash
port=/dev/serial/by-id/usb-FTDI_UM232R_USB__-__Serial_A156DVPL-if00-port0
stty -F $port raw -echo 115200
nc -k -n -l -p 1234 < $port > $port
/etc/systemd/system/rem_pulser.path (surveillance du fichier):
[Unit]
Description=Monitor the existence of the pulser USB port
[Path]
PathExists=/dev/serial/by-id/usb-FTDI_UM232R_USB__-__Serial_A156DVPL-if00-port0
[Install]
WantedBy=multi-user.target
/etc/systemd/system/rem_pulser.service (service gérant le script):
[Unit]
Description=Pulser through IP
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/rem_pulser.sh
[Install]
WantedBy=multi-user.target
Le fichier surveillé est un lien symbolique vers
/dev/ttyUSB<quelque-chose>, qui apparaît et disparaît quand on branche
ou on débranche l'instrument.
Après avoir fait « enable » et « start » sur les deux unités (avec
l'instrument branché), systemd me dit qu'elles sont actives, et qu'il y
a un lien Triggers/TriggeredBy entre les deux. Jusque là ça a l'air
bon. Seulement, si je débranche l'instrument, le lien symbolique
disparaît, et pourtant les deux unités restent actives. Si je rebranche,
le lien symbolique réapparaît (pointant vers un autre /dev/ttyUSB*),
mais le script ne fonctionne pas (il a toujours l'ancien /dev/ttyUSB*
d'ouvert).
Est-ce que quelqu'un aurait une idée pour résoudre ce problème ?
À+,
Edgar.
PS : J'ai trouvé un ticket de systemd qui ne m'apporte pas de
l'optimisme...
RFE: systemd.path should support deactivation
https://github.com/systemd/systemd/issues/3642