服务文件存在,但 systemd 找不到

服务文件存在,但 systemd 找不到

我创建了一个 systemd 服务文件并将其放入/etc/systemd/system/anfragen-3dkonfig-mapper.service.我运行systemctl daemon-reloadsystemctl daemon-reexec重新启动系统。

  • systemctl enable anfragen-3dkonfig-mapper结果是

    Failed to enable unit: Unit file anfragen-3dkonfig-mapper.service does not exist.
    
  • systemctl start anfragen-3dkonfig-mapper结果是

    Failed to start anfragen-3dkonfig-mapper.service: Unit anfragen-3dkonfig-mapper.service not found.
    
  • ls -lh /etc/systemd/system/anfragen-3dkonfig-mapper.service输出

    -rw-r--r--. 1 root root 440 Mar 19 12:08 /etc/systemd/system/anfragen-3dkonfig-mapper.service
    
  • cd /root && systemd-analyze verify anfragen-3dkonfig-mapper.service退出代码为 0 并且不打印任何输出。

  • mount节目

    /dev/sda2 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
    
  • 没有其他坐骑接触/usr/etc

  • 服务文件的内容是:

    [Unit]
    Description=Anfragen 3D Konfigurations Mapper Service
    After=network.target
    
    [Service]
    Restart=always
    ExecStartPre=-/usr/bin/podman stop anfragen-3dkonfig-mapper
    ExecStartPre=-/usr/bin/podman rm anfragen-3dkonfig-mapper
    ExecStart=/usr/bin/podman run --rm --name anfragen-3dkonfig-mapper-app -p 10010:10000 anfragen-3dkonfig-mapper-app:0.0.1
    ExecStop=/usr/bin/podman stop anfragen-3dkonfig-mapper
    
    [Install]
    WantedBy=multi-user.target
    
  • 以上所有命令均以用户身份运行root

  • 操作系统:CentOS Linux 版本 8.0.1905(核心)
  • 系统版本:239
  • Linux内核:Linux version 4.18.0-80.11.2.el8_0.x86_64 ([email protected]) (gcc version 8.2.1 20180905 (Red Hat 8.2.1-3) (GCC))
  • 我依稀记得几个月前另一个服务文件也遇到了类似的问题,经过几个小时的反复摸索和重命名服务文件后,它神奇地开始工作。

我对两件事感兴趣:

  • 如何调试这样的问题?
  • 怎么了?

答案1

正如 @JdeBP 所暗示的,错误的 SELinux 文件标签是导致该行为的原因。.输出中的字符表示ls该文件已设置安全上下文。所以要注意.输出中的ls

cd /etc/systemd/system && ls -lhZ some-other-service.service anfragen-3dkonfig-mapper.service印刷

-rw-r--r--. 1 root root unconfined_u:object_r:admin_home_t:s0        440 Mar 19 12:08 anfragen-3dkonfig-mapper.service
-rw-r--r--. 1 root root unconfined_u:object_r:systemd_unit_file_t:s0 457 Feb 24 11:42 some-other-service.service

可以看到,另一个服务文件有该systemd_unit_file_t标签,而损坏的服务则没有。这可以通过 修复restorecon anfragen-3dkonfig-mapper.service。之后标签如下所示:

-rw-r--r--. 1 root root unconfined_u:object_r:systemd_unit_file_t:s0 440 Mar 19 12:08 anfragen-3dkonfig-mapper.service
-rw-r--r--. 1 root root unconfined_u:object_r:systemd_unit_file_t:s0 457 Feb 24 11:42 some-other-service.service

systemd 现在的行为符合预期。

答案2

-rw-r--r--. 

SELinux 限制使您的生活变得复杂。

答案3

在移动了一些服务文件后,我花了一个小时来解决这个问题。中的符号链接/lib/systemd/system指向正确的文件,但中的符号链接/etc/systemd/system不是(其目标不再存在)。我删除了这个有问题的(损坏的)符号链接,用正确的符号链接替换它,并且它起作用了。

答案4

有类似的问题,我们在centos7上使用rootless podman。

重启后容器未启动,未找到服务。但在重新启动之前,服务已启用并存在于 /etc/systemd/system 中。服务是通过 syslink ln -s 从 /home/user 到 /etc/systemd 创建的

当您重新启动后运行时,Systemctl status nameOfService.service它会返回“无法找到单位服务名称。服务”。

当您运行该服务时systemctl daemon-reload,该服务会再次出现。

一种可能的解决方案是创建一个从 /root/ 到 /etc/systemd/system 的 syslink ln -s - 重新启动后您的服务仍然存在。

更好的解决方案

  • 创建您自己的服务来执行 daemon-reload 并启动您的服务

使用 daemon-reload 创建 startServiceOnBoot.sh 脚本并启动服务

    #!/bin/bash 
    sudo systemctl daemon-reload    
    sudo systemctl start nameOfService.service

使 sh 脚本可执行chmod +x startServiecOnBoot.sh

创建您的服务 /etc/systemd/system/serviceStarter.service

[Unit]
Description=Daemon Reloader
...

[Service]
ExecStart=/home/user/startServiecOnBoot.sh
...

[Install]
WantedBy=multi-user.target

在启动时启用服务systemctl enable serviceStarter.service您还可以检查启动新服务 serviceStarter.service 是否实际上也启动了 nameOfService.service 。

我在 systemd 中尝试使用 After= 和 .timer 服务,但没有成功。用于调试 $systemd-analyze Blame

相关内容