Я разрабатываю / разработал файл модуля для 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 работать синхронно? т.е. ожидание в течение установленного периода перед возвратом и указание, что служба была успешно / неуспешно запущена.
Я нормально перехожу на Type=forking
или любой другой вариант, например dbus (и написание кода для интеграции с dbus), если это означает, что systemctl завершится с ошибкой, указывающей на то, что служба не запустилась.
Чтобы упредить очевидный вопрос, да, после запуска 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)
и да systemctl status radiusd
возвращает код выхода, отличный от 0. Просто неприятно интегрировать это с солевым стеком. В настоящее время без синхронного запуска в комплекте солевой pkg
модуль сообщает, что служба работает, после применения обновлений конфигурации / кода, которые вызывают сбои службы.
Думаю, вы уже ответили на свой вопрос.
Если вы хотите выполнить форк демона, а также хотите, чтобы 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
./systemd-backlight@.service
Как видите, службы демонов используют Type=forking
и одноразовые службы выполнения / скрипты используют Type=oneshot