私は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ルールの設定に関するものです。これは、特定のデバイスを見たときにカーネルモジュールをロードすることであると理解しています。
どんな助けでもありがたいです。
私はこれを以前に解決したことはありませんが、「パスベースのアクティブ化」には適しているようです。
.path
で説明されているように、サービスファイルに「After =」句を含める代わりに、man systemd.path
ファイルを作成します。
/dev/bus/usb
または/sys/bus/usb
の下にある適切なファイルを見つけます。このファイルの存在は、「USBが起動している」ことを示しています。次に、作成する.path
ファイルを使用してファイルパスをsystemd
で監視します。 .path
ファイルは、ファイルが存在するときに.service
ファイルをアクティブにします。
私が行うことは、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サービスに。