summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2019-06-10 01:35:04 +0200
committerDavid Lamparter <equinox@diac24.net>2019-06-17 21:05:23 +0200
commit30b34aac84380239a6e1b7870ebe6380817fe56a (patch)
tree92085b9cda877ac97892c6baec5915283bf36420
parent15892762059a1889295cc6ca9d6b383131435757 (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.in25
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"