From df928c80b800dbbfe5d37d2c45c887c09b2beb4d Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Mon, 6 Sep 2021 14:37:33 +0200 Subject: [PATCH] Shutdown the container on abnormal signals (#55660) So far the finish script exits whenever the service terminated by a signal (indicated by 256 as first argument). This is the intended behavior when SIGTERM is being sent: SIGTERM is used on regular shutdown through the supervisor. We don't want the finish script to shutdown itself while being taken down by the supervisor already. However, every other signal which lead to a process exit likely means trouble: SIGSEGV, SIGILL, etc. In those cases we want the container to exit. The Supervisor (or restart policy of Docker in the container case) will take care of restarting if appropriate. --- rootfs/etc/services.d/home-assistant/finish | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/rootfs/etc/services.d/home-assistant/finish b/rootfs/etc/services.d/home-assistant/finish index d039fc04c86..119a90ea3c6 100644 --- a/rootfs/etc/services.d/home-assistant/finish +++ b/rootfs/etc/services.d/home-assistant/finish @@ -2,7 +2,19 @@ # ============================================================================== # Take down the S6 supervision tree when Home Assistant fails # ============================================================================== -if { s6-test ${1} -ne 100 } -if { s6-test ${1} -ne 256 } +define HA_RESTART_EXIT_CODE 100 +define SIGNAL_EXIT_CODE 256 +define SIGTERM 15 + +foreground { s6-echo "[finish] process exit code ${1}" } + +if { s6-test ${1} -ne ${HA_RESTART_EXIT_CODE} } +ifelse { s6-test ${1} -eq ${SIGNAL_EXIT_CODE} } { + # Process terminated by a signal + define signal ${2} + foreground { s6-echo "[finish] process received signal ${signal}" } + if { s6-test ${signal} -ne ${SIGTERM} } + s6-svscanctl -t /var/run/s6/services +} s6-svscanctl -t /var/run/s6/services