我创建了一个运行蓝牙服务器应用程序的服务,并按如下方式启动:
[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
当我在系统启动后查看该设备的日志时,我总是看到第一次启动失败而第二次启动成功。查看完整日志时,我看到我的服务首先启动,然后失败,后来仅启动了蓝牙服务。之后重试我的服务,然后所需的依赖项就在那里。
为什么 Systemd 忽略我服务中的After
和选项?Requires
我在这里阅读了其他网络文本、手册页和问题,这些建议完全使用这些选项来完成我的任务。但这对我不起作用。
该设备是带有 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