CentOS 7 出现 systemd Unit not found 错误,通常是因为服务名称拼写错误、未安装对应软件包或 systemd 配置缓存未刷新。建议优先检查服务名称拼写并执行 daemon-reload,避免直接重启服务器影响业务。
先说结论:该错误表明 systemd 无法在已知单元文件列表中找到指定服务,需按顺序排查名称、缓存和安装状态。
- 先确认:检查服务名称拼写及是否包含完整后缀(如 .service)。
- 先处理:执行 systemctl daemon-reload 刷新 systemd 配置缓存。
- 再验证:使用 systemctl status 确认服务状态是否变为 loaded 或 active。
命令速用版
若需快速尝试修复,可按顺序执行以下命令:
systemctl daemon-reload systemctl list-unit-files | grep 服务名 systemctl status 服务名
为什么会这样
systemd 启动时会加载单元文件缓存,若文件新增、修改或删除后未通知 systemd,就会报 Unit not found。
具体原因通常有三类:一是服务名称输入错误,包括大小写或后缀缺失;二是软件包未安装导致单元文件不存在;三是手动修改了/usr/lib/systemd/system 或/etc/systemd/system 目录下的文件后未刷新缓存。systemd 不会自动监听这些配置文件的变化,必须手动触发重载。
分步处理
步骤 1:核对服务名称
使用 tab 补全或列表命令确认准确名称。部分服务省略后缀可以识别,但建议带上完整后缀。
systemctl list-unit-files | grep 关键词
步骤 2:刷新 systemd 缓存
任何对单元文件的修改或新增后,必须执行重载命令。
sudo systemctl daemon-reload
步骤 3:检查软件包安装状态
若文件确实不存在,检查对应软件是否安装。
rpm -qa | grep 软件包名 yum install 软件包名
步骤 4:自定义单元文件
若是自建服务,确保文件放在/etc/systemd/system/目录下,并赋予执行权限。
怎么验证是否生效
执行状态查询命令,观察 Active 和 Load 状态。
systemctl status 服务名
若输出中包含 Loaded: loaded (...),说明单元文件已识别。若仍显示 Loaded: not-found,则文件路径或名称仍有问题。查看系统日志确认是否有权限错误或语法错误。
journalctl -u 服务名 -n 20
常见坑
- 忽略后缀:部分命令必须带.service 后缀,否则 systemd 可能无法匹配。
- 权限不足:修改系统目录下的单元文件需要 root 权限,否则写入失败。
- 缓存未清:修改文件后忘记执行 daemon-reload,导致旧缓存生效。
- 路径错误:自定义服务文件应优先放在/etc/systemd/system/,而非/usr/lib/systemd/system/。
常见问题
服务名拼写正确为什么还报找不到?
通常是因为 systemd 缓存未刷新。修改单元文件后必须运行 systemctl daemon-reload 才能生效。
Unit not found 和 Failed 有什么区别?
Unit not found 表示文件不存在或未加载,Failed 表示文件已加载但启动失败。前者是配置问题,后者是运行问题。
自定义服务文件应该放在哪个目录?
建议放在/etc/systemd/system/目录,该目录优先级高于/usr/lib/systemd/system/,且系统升级不会覆盖。