当 systemd 准备好蓝牙时,无法启动任务

时间:2021-07-23 08:47:22

标签: bluetooth raspbian systemd

我正在尝试在带有 systemd 的 raspi(运行 raspbian 10 - buster)上准备好蓝牙后开始一项任务。 我已经用这个内容添加了文件 /lib/systemd/system/my.service

[Unit]
After=bluetooth.target

[Service]
Type=idle
ExecStart=/root/my.sh

[Install]
Wants=bluetooth.target

当我使用 systemd-analyse plot 创建的图表查看启动时发生的情况时,我看到我的服务在 bluetooth.target 单元被激活之前启动。 但是当我检查 systemctl show my.service 时,它说

...
After=basic.target bluetooth.target system.slice systemd-journald.socket sysinit.target
...

那么有人能解释一下为什么我的服务在 bluetooth.target 之后没有启动吗? 谢谢

[编辑] 我遵循了@ukBaz 的建议,将我的服务文件移到了 /etc/systemd/system 并将 Wants 节移到了 Unit 部分(实际上我将其更改为“Requires”)。 所以我的文件现在包含

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

[Service]
Type=idle
ExecStart=/root/my.sh

[Install]
WantedBy=multi-user.target

现在我的服务在 bluetooth.target 之后启动...但是 bluetooth.target 很早就启动了! systemctl show bluetooth.target 告诉我 'After=bluetooth.service' 那么它是如何在 bluetooth.service 之前启动/到达的?

1 个答案:

答案 0 :(得分:0)

系统的单元文件副本一般保存在/lib/systemd/system目录中。当软件在系统上安装单元文件时,这是它们默认放置的位置。

如果您希望修改单元的运行方式或创建您自己的单元,最好的位置是在 /etc/systemd/system 目录中。在此目录位置找到的单元文件优先于文件系统上的任何其他位置。

Wants 应该在 [Unit] 部分而不是 [Install] 部分。

[Install] 部分是可选的,用于定义启用或禁用单元的行为。我在本节中只有每个 put WantedBy=multi-user.targetmulti-user.target 告诉 systemd(据我所知)它是“正常操作”所必需的。