![systemd 服务似乎已启动(使用通知),但随后立即失败](https://linux22.com/image/675323/systemd%20%E6%9C%8D%E5%8A%A1%E4%BC%BC%E4%B9%8E%E5%B7%B2%E5%90%AF%E5%8A%A8%EF%BC%88%E4%BD%BF%E7%94%A8%E9%80%9A%E7%9F%A5%EF%BC%89%EF%BC%8C%E4%BD%86%E9%9A%8F%E5%90%8E%E7%AB%8B%E5%8D%B3%E5%A4%B1%E8%B4%A5.png)
在执行 rpm 安装并启动服务“homemade-auth-svc”之后,它似乎启动得很顺利,但随后失败并不断重启。
journalctl -ex u homemade-auth-svc.service:
Jan 14 21:01:51 UI systemd[1]: Starting A service for homemade authentication....
-- Subject: Unit homemade-auth-svc.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit homemade-auth-svc.service has begun starting up.
Jan 14 21:01:51 UI homemade-auth-svc[1709]: homemade-auth: starting...
Jan 14 21:01:51 UI systemd[1]: Started A service for homemade authentication..
-- Subject: Unit homemade-auth-svc.service has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit homemade-auth-svc.service has finished starting up.
--
-- The start-up result is done.
Jan 14 21:01:51 UI systemd[1]: homemade-auth-svc.service holdoff time over, scheduling restart.
Jan 14 21:01:51 UI systemd[1]: Stopping A service for homemade authentication....
-- Subject: Unit homemade-auth-svc.service has begun shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit homemade-auth-svc.service has begun shutting down.
Jan 14 21:01:51 UI systemd[1]: Starting A service for homemade authentication....
-- Subject: Unit homemade-auth-svc.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
....
systemctl status homemade-auth-svc:
homemade-auth-svc.service - A service for homemade authentication.
Loaded: loaded (/usr/lib/systemd/system/homemade-auth-svc.service; enabled)
Active: failed (Result: start-limit) since Thu 2016-01-14 21:01:52 PST; 20min ago
Process: 1725 ExecStart=/usr/bin/HomemadeAuthSvc (code=exited, status=0/SUCCESS)
Main PID: 1725 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/homemade-auth-svc.service
Jan 14 21:01:52 UI systemd[1]: homemade-auth-svc.service holdoff time over, scheduling restart.
Jan 14 21:01:52 UI systemd[1]: Stopping A service for homemade authentication....
Jan 14 21:01:52 UI systemd[1]: Starting A service for homemade authentication....
Jan 14 21:01:52 UI systemd[1]: homemade-auth-svc.service start request repeated too quickly, refusing to start.
Jan 14 21:01:52 UI systemd[1]: Failed to start A service for homemade authentication..
Jan 14 21:01:52 UI systemd[1]: Unit homemade-auth-svc.service entered failed state.
自制-auth-svc.服务:
[Unit]
Description=A service for homemade authentication.
After=network.target
[Service]
Type=notify
NotifyAccess=all
ExecStart=/usr/bin/HomemadeAuthSvc
StandardOutput=null
Restart=always
[Install]
WantedBy=multi-user.target
Alias=homemade-auth-svc.service
我们在子守护进程中调用 sd_notify(0, "READY=1");,但是,如果我们在等待 10 秒后成功退出,然后在父进程中执行此操作,这似乎无关紧要。然后 systemd 会等待这么长时间,然后给出相同的结果。就好像它等待 sd_notify(),声明成功,然后立即重新启动服务。现在,rpm 修改 lightdm.service(登录服务)以依赖于我们(安装一个文件,内容如下:
[Unit]
Wants=homemade-auth-svc.service
进入: /etc/systemd/system/lightdm.service.d/ )
但由于 lightdm 已经在运行,所以我认为这不应该是个问题。
Systemd 是运行在 Fedora 20 上的 208 版本。
答案1
根据 Michael Hampton 和对 systemd-devel 邮件列表的一些半确认性浏览,似乎您无法将 sd_notify (& Type=notify) 与传统的 fork() 守护进程一起使用。因此,我让服务成为老式的 Type=forking,并让子服务通过共享管道通知父服务何时准备就绪,然后父服务退出,这反过来又让 systemd 知道服务已准备就绪。
值得一提的是,我们尝试暂停依赖服务(登录管理器)几秒钟,但失败了,systemd 等待的时间不到 1 秒就启动了它。