systemdサービスがデバイスパスを特定し、変更されたときに再起動する方法はありますか?

systemdサービスがデバイスパスを特定し、変更されたときに再起動する方法はありますか?

起動時にデバイスパスが必要なデーモンを実行しています。デバイスはUSBバスに接続されていますが、時々USB接続が切断されて再接続されますが(コネクタが緩んでいるか、ハードウェアがクラッシュした場合、問題がまだ見つかりません)、デバイスに別の名前が付けられます(例/dev/ttyACM0:)/dev/ttyACM1

AISレシーバ(関心のあるQuark-elec QK-A022)からNMEAデータを出力する仮想シリアルポート。

同時に、1つのデバイスだけがUSBに接続されると確信しています。

特定の種類のデバイスがシステムに接続されているときにsystemdを使用してサービスを開始/再起動する方法はありますか?デバイスがそこにリストされていることがわかっsystemctl list-units --type=deviceたので期待されていましたが、これまでに見つけたすべての例は、明示的に servicename@device を起動することに基づいています。

root@ais:/home/pi# systemctl list-units --type=device | fgrep STM
sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.2-1\x2d1.2:1.0-tty-ttyACM1.device                      loaded active plugged STM32F407

同時に、1つのデバイスだけがUSBに接続されると確信しています。

答え1

今日、デバイスが接続されているときにデーモンを実行する標準的な方法は、デーモン用のsystemdデバイスを作成し、デバイスを参照するデバイスのudevエントリを追加することです。たとえば、/etc/udev/rules.d/90-my.rules次の行を使用してファイルを作成します。

ACTION=="add", KERNEL=="ttyACM*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="myacm@%k.service"

そしてファイル/etc/systemd/system/[email protected]

[Unit]
Description=my serial daemon for ttyACM0
[Service]
ExecStart=/bin/myscript %i

sudo udevadm control --reloadとが必要な場合がありますsudo systemctl daemon-reload。デバイスを接続すると、スクリプトはパラメータを使用して実行する必要があります(ttyACM0これがパラメータと呼ばれる場合)。ログファイルでエラーを確認してください。

man 7 daemonセクションを参照してください新しいデーモンプロセスそしてデバイスベースの有効化、またman systemd.device

答え2

systemdがこれを行うことができるかどうかはわかりませんが、デバイスの変更が検出されたらudevを使用してサービスを再起動/再ロードできます。

関連情報