diff options
| author | David Lamparter <equinox@diac24.net> | 2019-06-10 01:35:04 +0200 | 
|---|---|---|
| committer | David Lamparter <equinox@diac24.net> | 2019-06-17 21:05:23 +0200 | 
| commit | 30b34aac84380239a6e1b7870ebe6380817fe56a (patch) | |
| tree | 92085b9cda877ac97892c6baec5915283bf36420 | |
| parent | 15892762059a1889295cc6ca9d6b383131435757 (diff) | |
tools: retain sanity when reloading under systemd
Without this, we end up restarting watchfrr with the systemd watchdog
non-functional & tripped a bit later.  Also, if watchfrr is in the
"control" cgroup, systemd 232 will kill it.  (241 apparently doesn't.
Can't find anything about this in systemd's ChangeLog though.)
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
(cherry picked from commit 9c251d376ad8e604c25767b32c2816e9ae75a738)
| -rw-r--r-- | tools/frrinit.sh.in | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/tools/frrinit.sh.in b/tools/frrinit.sh.in index 0f5ed85864..423d6b9b1d 100644 --- a/tools/frrinit.sh.in +++ b/tools/frrinit.sh.in @@ -71,6 +71,16 @@ reload)  		exit 1  	fi +	# systemd doesn't set WATCHDOG_USEC for reload commands. +	watchfrr_pidfile="$V_PATH/watchfrr.pid" +	watchfrr_pid="`cat \"$watchfrr_pidfile\"`" +	if [ -d "/proc/$watchfrr_pid" ]; then +		wdt="`tr '\0' '\n' < /proc/$watchfrr_pid/environ | grep '^WATCHDOG_USEC='`" +		wdt="${wdt#WATCHDOG_USEC=}" +		[ -n "$wdt" ] && : ${WATCHDOG_USEC:=$wdt} +		[ -n "$WATCHDOG_USEC" ] && export WATCHDOG_USEC +	fi +  	# restart watchfrr to pick up added daemons.  	# NB: This will NOT cause the other daemons to be restarted.  	daemon_list daemons @@ -78,6 +88,21 @@ reload)  	daemon_stop watchfrr && \  		daemon_start watchfrr +	# make systemd not kill watchfrr after ExecReload completes +	# 3 goats were sacrificed to restore sanity after coding this +	watchfrr_pid="`cat \"$watchfrr_pidfile\"`" +	if [ -f "/proc/$watchfrr_pid/cgroup" -a -d "/sys/fs/cgroup/systemd" ]; then +		cg="`egrep '^[0-9]+:name=systemd:' \"/proc/$watchfrr_pid/cgroup\"`" +		cg="${cg#*:*:}" + +		cgmain="$cg" +		cgmain="${cgmain%/.control}" +		cgmain="${cgmain%/control}" + +		[ -n "$cg" -a "$cg" != "$cgmain" ] && \ +			echo "$watchfrr_pid" > "/sys/fs/cgroup/systemd/$cgmain/tasks" +	fi +  	NEW_CONFIG_FILE="${2:-$C_PATH/frr.conf}"  	[ ! -r $NEW_CONFIG_FILE ] && log_failure_msg "Unable to read new configuration file $NEW_CONFIG_FILE" && exit 1  	"$RELOAD_SCRIPT" --reload "$NEW_CONFIG_FILE"  | 
