我正在开发/已经开发了一个 systemd 单元文件
[Unit]
Description=FreeRADIUS multi-protocol policy server
After=syslog.target network.target
Documentation=man:radiusd(8) man:radiusd.conf(5) http://wiki.freeradius.org/ http://networkradius.com/doc/
[Service]
EnvironmentFile=-/etc/sysconfig/radiusd
ExecStartPre=/usr/sbin/radiusd $FREERADIUS_OPTIONS -Cxm -lstdout
ExecStart=/usr/sbin/radiusd $FREERADIUS_OPTIONS -fm
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
systemctl radiusd start
遇到一个问题,即使/usr/sbin/radiusd -fm
退出,调用也不会返回错误代码。
有没有办法让 systemctl 同步运行?即等待一段时间后再返回并指示服务启动成功/失败。
如果这意味着 systemctl 将退出并出现错误(表明服务启动失败),那么我可以同意更改为Type=forking
或任何其他选项,例如 dbus(并编写代码以与 dbus 集成)。
首先提出一个显而易见的问题,是的,启动后 systemd 确实将该单元视为失败。
bash-4.2# systemctl status radiusd
radiusd.service - FreeRADIUS multi-protocol policy server
Loaded: loaded (/usr/lib/systemd/system/radiusd.service; enabled)
Active: failed (Result: start-limit) since Wed 2015-08-12 12:26:18 EDT; 19s ago
Docs: man:radiusd(8)
man:radiusd.conf(5)
http://wiki.freeradius.org/
http://networkradius.com/doc/
Process: 10610 ExecStart=/usr/sbin/radiusd $FREERADIUS_OPTIONS -fm (code=exited, status=1/FAILURE)
Main PID: 10610 (code=exited, status=1/FAILURE)
并且 yessystemctl status radiusd
确实返回了非 0 退出代码。将它与 salt stack 集成起来很烦人。目前,没有同步启动,捆绑的 saltstackpkg
模块在应用导致服务故障的配置/代码更新后会报告服务正在运行。
答案1
我想你已经回答了你自己的问题。
如果您想要分叉守护进程,并且希望 systemctl 返回状态代码,Type=forking
这是可行的方法。还有Type=oneshot
。您应该只在希望脚本/程序退出时使用它,而不是作为守护进程运行。systemctl 实际上会等待程序ExecStart=
完成。
从我的 CentOS 7.1 机器上:
[unixguy@infra01 system]$ pwd
/usr/lib/systemd/system
[unixguy@infra01 system]$ find ./ -type f | xargs grep 'Type=' | awk -F: '{print $2}' | sort | uniq -c | sort -nr | head -5
64 Type=oneshot
37 Type=forking
11 Type=notify
6 Type=idle
6 Type=dbus
[unixguy@infra01 system]$ find ./ -type f | xargs grep 'Type=forking' | awk -F: '{print $1}' | head
./rc-local.service
./rdisc.service
./tcsd.service
./plymouth-kexec.service
./plymouth-halt.service
./plymouth-poweroff.service
./plymouth-reboot.service
./plymouth-start.service
./rpc-statd.service
./systemd-cfengine-bootstrap.service
[unixguy@infra01 system]$ find ./ -type f | xargs grep 'Type=oneshot' | awk -F: '{print $1}' | head
./systemd-kexec.service
./quotaon.service
./halt-local.service
./initrd-cleanup.service
./initrd-parse-etc.service
./initrd-switch-root.service
./initrd-udevadm-cleanup-db.service
./kmod-static-nodes.service
./systemd-binfmt.service
./[email protected]
如您所见,守护程序服务正在使用Type=forking
,一次性执行服务/脚本正在使用Type=oneshot