[systemd] Service conditionné sur l'existenced'un fichier

Page principale

Répondre à ce message
Auteur: Edgar Bonet
Date:  
À: Liste Guilde
Nouveaux-sujets: Re: [systemd] Service conditionné sur l'existence d'un fichier
Sujet: [systemd] Service conditionné sur l'existenced'un fichier
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