From 30b34aac84380239a6e1b7870ebe6380817fe56a Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Mon, 10 Jun 2019 01:35:04 +0200 Subject: [PATCH] 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 (cherry picked from commit 9c251d376ad8e604c25767b32c2816e9ae75a738) --- tools/frrinit.sh.in | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tools/frrinit.sh.in b/tools/frrinit.sh.in index 0f5ed8586..423d6b9b1 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" -- 2.39.2