Files
cloudron-box/src/scripts/kill-child.sh

49 lines
1.1 KiB
Bash
Raw Normal View History

#!/bin/bash
set -eu -o pipefail
if [[ ${EUID} -ne 0 ]]; then
echo "This script should be run as root." > /dev/stderr
exit 1
fi
if [[ $# -eq 0 ]]; then
echo "No arguments supplied"
exit 1
fi
if [[ "$1" == "--check" ]]; then
echo "OK"
exit 0
fi
function killtree() {
local pid=$1
for cpid in $(pgrep -P "$pid"); do
killtree "${cpid}" || true
done
echo "kill-child: killing $pid"
kill -SIGTERM "${pid}" 2>/dev/null || true
sleep 1
kill -SIGKILL "${pid}" 2>/dev/null || true
}
readonly target_pid="$1"
readonly expected_parent_pid="$2"
readonly target_actual_parent_pid=$(ps -o ppid= -p "${target_pid}" 2>/dev/null | tr -d ' ')
if [[ -z "${target_actual_parent_pid}" ]]; then
echo "kill-child: target PID ${target_pid} does not exist."
exit 1
fi
if [[ "${target_actual_parent_pid}" -ne "${expected_parent_pid}" ]]; then
echo "kill-child: refusing to kill — PID ${target_pid} is not a child of ${expected_parent_pid}."
exit 1
fi
readonly child_cmd=$(ps -o cmd= -p "${target_pid}")
echo "kill-child: kill PID ${target_pid} (command: ${child_cmd})"
killtree ${target_pid}