web-dev-qa-db-ja.com

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

私はRaspbian Stretchでプログラムを実行していて、libusbの上に実装された特殊なプロトコルを使用して、USB経由で携帯電話と通信しています。

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

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

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

[Install]
WantedBy=multi-user.target

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

私がWebで見つけることができるほとんどの情報は、udevルールの設定に関するものです。これは、特定のデバイスを見たときにカーネルモジュールをロードすることであると理解しています。

どんな助けでもありがたいです。

6
Nick Lee

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

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

/dev/bus/usbまたは/sys/bus/usbの下にある適切なファイルを見つけます。このファイルの存在は、「USBが起動している」ことを示しています。次に、作成する.pathファイルを使用してファイルパスをsystemdで監視します。 .pathファイルは、ファイルが存在するときに.serviceファイルをアクティブにします。

2
Mark Stosberg

私が行うことは、udevルールを使用してsystemdデバイスユニットを作成することです。例:作成/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サービスに。

1
Diego