如何解决当 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 之前启动/到达的?
解决方法
系统的单元文件副本一般保存在/lib/systemd/system
目录中。当软件在系统上安装单元文件时,这是它们默认放置的位置。
如果您希望修改单元的运行方式或创建您自己的单元,最好的位置是在 /etc/systemd/system
目录中。在此目录位置找到的单元文件优先于文件系统上的任何其他位置。
Wants
应该在 [Unit]
部分而不是 [Install]
部分。
[Install]
部分是可选的,用于定义启用或禁用单元的行为。我在本节中只有每个 put WantedBy=multi-user.target
。 multi-user.target
告诉 systemd
(据我所知)它是“正常操作”所必需的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。