[systemd-devel] Performing a config check before restarting a process
Brian Kroth
bpkroth at gmail.com
Mon May 16 18:03:31 UTC 2016
Terry Burton <tez at terryburton.co.uk> 2016-05-16 17:43:
>On 13 May 2016 at 00:04, Terry Burton <tez at 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 pass
I 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-ok
Basically, 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <https://lists.freedesktop.org/archives/systemd-devel/attachments/20160516/7de4aa6a/attachment.sig>
More information about the systemd-devel
mailing list