1 votes

Existe-t-il un moyen de rendre systemctl start synchrone ?

Je développe ou j'ai développé un fichier d'unité pour 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

Un problème survient lorsque l'on appelle systemctl radiusd start ne renvoie pas de code d'erreur, même si /usr/sbin/radiusd -fm sort avec un.

Existe-t-il un moyen de faire en sorte que systemctl agisse de manière synchrone, c'est-à-dire qu'il attende un certain temps avant de revenir et d'indiquer que le service a été démarré avec succès ou non.

Je ne vois pas d'inconvénient à ce que l'on passe à Type=forking ou l'une des autres options, comme dbus (et écrire le code pour intégrer dbus) si cela signifie que systemctl sortira avec une erreur indiquant que le service n'a pas pu démarrer.

Pour devancer la question évidente, oui, après le démarrage, systemd considère que l'unité est en panne.

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)

et oui systemctl status radiusd renvoie un code de sortie différent de 0. Il est juste ennuyeux d'intégrer cela à la pile de sel. Actuellement, sans démarrage synchrone, la pile saltstack pkg signale que le service fonctionne, après avoir appliqué les mises à jour de la configuration et du code qui provoquent des défaillances du service.

2voto

alphak Points 1

Je pense que vous avez déjà répondu à votre propre question.

Si vous souhaitez forker un démon et que systemctl renvoie le code d'état, Type=forking est la voie à suivre. Il y a Type=oneshot également. Vous ne devez l'utiliser que si vous vous attendez à ce que votre script/programme se termine, et non qu'il tourne en tant que démon. systemctl attend en fait la commande ExecStart= pour terminer le programme.

Depuis ma machine 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

Comme vous pouvez le constater, les services démon utilisent la fonction Type=forking et les services d'exécution unique/scripts utilisent Type=oneshot

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X