tripleo-heat-templates/deployment/neutron/kill-script
Slawek Kaplonski aaa8ce1a6d Remove sidecar containers after SIGTERM is send to stop them
Previously neutron's sidecar containers were removed only when
kill-script was called with SIGKILL signal, if it was SIGTERM, then
container was stopped but not removed.

Now kill-script script will try to delete stopped container in both
cases, when SIGKILL and SIGTERM is send to the script.

Closes: rhbz#2080811
Change-Id: I79e70731779067093f6de2879b98cfe8f2b7a89f
2022-05-04 16:34:20 +02:00

76 lines
1.5 KiB
Bash

#!/bin/bash
{% if debug_enabled|bool -%}
set -x
{% endif -%}
add_date() {
echo "$(date) $@"
}
# Set up script logging for debugging purpose.
# It will be taken care of by logrotate since there is the .log
# suffix.
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>>/var/log/neutron/kill-script.log 2>&1
SIG=$1
PID=$2
NETNS=$(ip netns identify ${PID})
if [ "x${NETNS}" == "x" ]; then
CLI="nsenter --all --preserve-credentials -t 1 podman"
SIG=9
else
CLI="nsenter --net=/run/netns/${NETNS} --preserve-credentials -m -t 1 podman"
fi
kill_container() {
add_date "Stopping container $1 ($2)"
$CLI stop $2
delete_container $1 $2
}
signal_container() {
SIGNAL=$3
if [ -z "$SIGNAL" ]; then
SIGNAL="HUP"
fi
add_date "Sending signal '$SIGNAL' to $1 ($2)"
$CLI kill --signal $SIGNAL $2
}
delete_container() {
add_date "Deleting container $1 ($2)"
$CLI rm $2 || echo "Deleting container $1 ($2) failed"
}
{% raw -%}
if [ -f /proc/$PID/cgroup ]; then
# Get container ID based on process cgroups
CT_ID=$(awk 'BEGIN {FS=".scope|-"} /0::|:pids:/ {if ($(NF-1)) print $(NF-1);exit}' /proc/$PID/cgroup)
CT_NAME=$($CLI inspect -f '{{.Name}}' $CT_ID)
case $SIG in
HUP)
signal_container $CT_NAME $CT_ID
;;
9)
kill_container $CT_NAME $CT_ID
;;
15)
signal_container $CT_NAME $CT_ID 15
delete_container $CT_NAME $CT_ID
;;
*)
add_date "Unknown action ${SIG} for ${CT_NAME} ${CT_ID}"
exit 1
;;
esac
else
add_date "No such PID: ${PID}"
exit 1
fi
{% endraw %}