Terry Burton <t...@terryburton.co.uk> 2016-05-16 17:43:
On 13 May 2016 at 00:04, Terry Burton <t...@terryburton.co.uk> wrote:I have a process (ISC DHCP) that has no reload or soft restart mechanism. The only way to "reload" it is a stop and start.I understand systemd's design choice of maintaining a clear distinction between reload and restart based on whether the service is interrupted or not, so it's clear that I should use restart. However, in the event that the user invokes "restart" I would like to validate the config file before taking the Stop action to avoid loss of service (as was the case for the reload action of my previous init scripts.) We do not however have ExecStopPre and there does not appear to be a way to interrupt a Stop action based on the result of ExecStop so I'm not sure where that leaves me? Does anyone have a useful recipe that accomplishes this? Perhaps such a config check is considered one of those things that lives in a support script or user's best practises outside of the init system... That seems a shame though.A quick nudge before moving along...
Still learning the ins and outs of systemd myself, so I don't think I have a solution for you, but I'd also be interested in this. I've run into a few cases where I expected something to reload/restart and didn't realize that it hadn't because the output was buried in the journal somehow.
In the past I might have done something like this in an /etc/default/dhcpd file (in Debian based distros) knowing that it would be sourced as a generic shell file by the init script before actually being run and not just a list of key=value environment variable pairs like systemd expects:
CONFFILE='/etc/dhcp/dhcpd.conf' if [ "$1" != "stop" ]; then if ! dhcpd -t -cf "$CONFFILE" > /dev/null; then echo "ERROR: '$CONFFILE' failed to lint check. Check the logs for details." >&2 exit 1 fi fi # else, let it passI was hoping there was something like a ConditionReturnsZero=/path/to/some/script that would prevent start/stop/restart/etc. actions if the script didn't exit 0.
Maybe you could hack around that with something like the following (totally untested):
/etc/systemd/system/dhcpd-lint-check.service: [Unit] Before=dhcpd.service [Service] Type=oneshot ExecStartPre=/bin/rm -f /etc/dhcp/dhcpd-conf-lint-checks-ok ExecStart=/usr/sbin/dhcpd -t -cf /etc/dhcp/dhcpd.conf ExecStartPost=/usr/bin/touch /etc/dhcp/dhcpd-conf-lint-checks-ok RemainAfterExit=false [Install] WantedBy=dhcpd.service /etc/systemd/system/dhcpd.service.d/01-lint-check-condition.conf: [Unit] ConditionPathExists=/etc/dhcpd/dhcpd-conf-lint-checks-okBasically, add a condition to the dhcpd service for a canary file existing. That canary file gets managed by a mini oneshot service that checks the dhcpd.conf file for sanity, but doesn't remain, so I think that it should be attempted to be started before the dhcpd.service is. Probably I'm missing some ordering/dependency races though. Maybe the ExecStartPost needs to be combined with ExecStart in a shell && style combo. Not sure offhand.
Anyways, let us know if you do find something that works out for you. Thanks, Brian
signature.asc
Description: Digital signature
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel