systemdサービスファイルで、「USBの準備ができた後」とはどうすればいいですか?


2

libusbの上に実装された特別なプロトコルを使って、USB経由で携帯電話と話す、Raspbian Stretch上で動作するプログラムを持っています。

プログラムを起動時に実行したいので、systemdサービスファイルを作成しますが、どのターゲットがその後に実行されるべきかわからないのですが。

[Unit]
Description=My Program
After=network.target  <-- ???

[Service]
ExecStart=/home/pi/myprogram
User=root

[Install]
WantedBy=multi-user.target

このコンテンツは仕事をすることができますが、それは適切に後に何をすべきですか? 「USBの準備ができたら」と言うにはどうすればいいですか。

私がWeb上で見つけることができるほとんどの情報はudevルールを設定することに関するものです。

任意の助けは大歓迎です。

回答:


1

私はこれを以前に解決したことはありませんが、「パスベースのアクティブ化」に適している可能性があるようです。

サービスファイルに "After ="句を含める代わりに、次のように作成します。 .path で説明されているように、ファイル man systemd.path

適切なファイルを見つけてください。 /dev/bus/usb または /sys/bus/usbその存在は「USBが起動している」ことを示します。それなら systemd を使用してファイルパスを監視します。 .path 作成するファイルの .path ファイルはそれからあなたの活動化させる .service ファイルが存在する場合はfile。


ありがとうございました。私は最終的に道を監視します /dev/bus/usb/001。それがRaspberry PiのUSBバスです。具体的な例に興味がある人のために、 ここに もう一つの良い答えです。
Nick Lee

0

私がやるのは システム化装置ユニット udevルールを使う例:作成 /etc/udev/rules.d/20-usb-bus.rules と:

KERNEL=="usb[1-2]", TAG+="systemd"

次回の起動時(またはudevのルールの再読み込み時)には、システムデバイスユニットが用意されています。

# 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
...

USBバスの準備が整った後で、サービスを開始することができます。

[Unit]
...
After=dev-bus-usb-001-001.device dev-bus-usb-002-001.device

あなたのsystemdサービスに。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.