我正在尝试编写一个简单的服务,仅检查 USB 设备是否已连接。以下是该服务的单元文件内容:
cat /etc/systemd/system/check-usb.service
[Unit]
Description=Check USB storage
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c 'cat /sys/kernel/debug/usb/devices | grep -o "ProdID=5567"'
Before=multi-user.target
[Install]
RequiredBy=multi-user.target, graphical.target
我知道可能有更好的方法来检查这一点,但这是我脑海中浮现的第一个解决方案。我的目标行为将是:1. 具有该 ID 的 USB 已连接,正常启动 2. 未找到具有该 ID 的 USB,服务将处于失败状态,并且我不希望任何服务加载到 emergency.target 之上(我希望它以单用户模式启动)
我的困惑始于这样一个事实:无论此服务是否运行,系统始终都会加载所有必要的服务并启动到图形模式。如果我检查状态,如下所示,我会看到 graphic.target 显示为不活动状态:
systemctl list-units --type=target --state=inactive
UNIT LOAD ACTIVE SUB DESCRIPTION
● all.target not-found inactive dead all.target
emergency.target loaded inactive dead Emergency Mode
getty-pre.target loaded inactive dead Login Prompts (Pre)
graphical.target loaded inactive dead Graphical Interface
multi-user.target loaded inactive dead Multi-User System
network-pre.target loaded inactive dead Network (Pre)
rescue.target loaded inactive dead Rescue Mode
shutdown.target loaded inactive dead Shutdown
umount.target loaded inactive dead Unmount All Filesystems
如果我列出 graphic.target 的依赖项,我可以看到我的自定义服务处于失败状态,但所有其他服务均已启动并正在运行。我的问题是,如果具有此依赖项的服务未启动,RequiredBy 指令是否应该阻止服务启动?我应该怎么做才能实现我想要的行为?
如果有什么不清楚的地方,我深表歉意,如果是这样,请告诉我。我在虚拟机上使用 ubuntu 18.04.4 进行测试:
cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
谢谢,如果需要更多详细信息,请告诉我。我尝试搜索 systemd 文档和无数论坛,但没有找到答案,因此,我在这里发帖。
提前谢谢你,乔治
答案1
“[I]如果具有此依赖关系的服务未启动,那么RequiredBy指令不是应该阻止服务启动吗?“
不,恰恰相反。
您的服务表示,需要这些目标启动并运行,然后该服务才能运行。
这是一份依赖项,不是列表反向依赖。
例子:
服务 C 需要 A 和 B 启动后才能运行:
RequiredBy=A.target,B.target
如果 A 失败,则 C 将不会运行。