diff --git a/tools/frrcommon.sh.in b/tools/frrcommon.sh.in index 658a625dd96b..cd47fa85172c 100755 --- a/tools/frrcommon.sh.in +++ b/tools/frrcommon.sh.in @@ -201,7 +201,10 @@ daemon_stop() { is_user_root || exit 1 all=false + sig=INT + # these can't be used at the same time anyway [ "$2" = "--reallyall" ] && all=true + [ "$2" = "--reload" ] && sig=USR1 pidfile="$V_PATH/$daemon${inst:+-$inst}.pid" vtyfile="$V_PATH/$daemon${inst:+-$inst}.vty" @@ -217,8 +220,14 @@ daemon_stop() { return 1 fi - debug "kill -2 $pid" - kill -2 "$pid" + if [ "$FRR_COLLECT_CORE" = "1" ]; then + debug "kill -6 $pid" + kill -6 "$pid" + else + debug "kill -$sig $pid" + kill -$sig "$pid" + fi + cnt=1200 while kill -0 "$pid" 2>/dev/null; do sleep .1 diff --git a/tools/frrinit.sh.in b/tools/frrinit.sh.in index 4b4fd2a58943..2ab0b3ac6aab 100644 --- a/tools/frrinit.sh.in +++ b/tools/frrinit.sh.in @@ -89,7 +89,7 @@ reload) # NB: This will NOT cause the other daemons to be restarted. daemon_list enabled_daemons disabled_daemons watchfrr_options="$watchfrr_options $enabled_daemons" - daemon_stop watchfrr && \ + daemon_stop watchfrr --reload && \ daemon_start watchfrr # If we disable an arbitrary daemon and do reload, diff --git a/watchfrr/watchfrr.c b/watchfrr/watchfrr.c index 391f3ac7d15e..8387ff4449b0 100644 --- a/watchfrr/watchfrr.c +++ b/watchfrr/watchfrr.c @@ -1097,6 +1097,13 @@ static FRR_NORETURN void sigint(void) exit(0); } +static FRR_NORETURN void sigusr1(void) +{ + zlog_notice("Terminating to handle reload (SIGUSR1)"); + systemd_send_status("watchfrr restarting to handle changes in daemons"); + exit(0); +} + static int valid_command(const char *cmd) { char *p; @@ -1352,6 +1359,10 @@ static struct frr_signal_t watchfrr_signals[] = { .signal = SIGCHLD, .handler = sigchild, }, + { + .signal = SIGUSR1, + .handler = sigusr1, + }, }; /* clang-format off */