Systemdは私のサービスのAfterとRequiresを無視します。

Systemdは私のサービスのAfterとRequiresを無視します。

Bluetoothサーバーアプリケーションを実行するサービスを作成し、次のように起動しました。

[Unit]
After=bluetooth.service
Requires=bluetooth.service

[Service]
Type=simple
ExecStartPre=/usr/bin/sdptool add SP
ExecStartPre=/bin/sleep 0.5
ExecStartPre=/bin/hciconfig hci0 piscan
ExecStart=/usr/local/bin/my-service.py
ExecStartPost=/usr/bin/bluetoothctl discoverable on
Restart=always
RestartSec=15

[Install]
WantedBy=multi-user.target

システム起動後にこのデバイスのログを表示すると、常に最初の起動が失敗し、2番目の起動が成功したことがわかります。完全なログを見ると、私のサービスが最初に起動してから失敗し、後でBluetoothサービスのみが起動することがわかります。その後、サービスを再試行しましたが、必要な依存関係がありました。

Systemdが私のサービスとオプションを無視するのはなぜですかAfterRequires

私は私のタスクを実行するために正確にこれらのオプションを使用することを提案する他のWebテキスト、マニュアルページ、および質問をここで読んだ。しかし、これは私には効果がありません。

デバイスは、Raspbian OS、Linuxカーネル5.4.51、およびSystemd 241を搭載したRaspberry Pi 3B+です。

答え1

bluezのbluetooth.serviceにはいくつかの珍しい点があるようです(この質問を見ました。)。私はその理由を完全に理解していません。しかし、WantedByサービスをmulti-user.targetからbluetooth.targetに変更することで問題は解決しました。

[Install]
WantedBy=bluetooth.target

関連情報