有没有办法让 systemctl start 同步

有没有办法让 systemctl start 同步

我正在开发/已经开发了一个 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

相关内容