如何防止 systemd 启动在特定服务和/或目标上具有 RequriedBy 的服务

如何防止 systemd 启动在特定服务和/或目标上具有 RequriedBy 的服务

我正在尝试编写一个简单的服务,仅检查 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 将不会运行

相关内容