[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