From 6ec4c02e406344877778cfd40d4a274c4c4397e8 Mon Sep 17 00:00:00 2001 From: Thomas Oettli Date: Sat, 2 Nov 2024 01:07:11 +0100 Subject: [PATCH] improve handling / killing of hanging background procs --- snmpd-oid-daemon.sh | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/snmpd-oid-daemon.sh b/snmpd-oid-daemon.sh index 88d3213..33d3fc2 100755 --- a/snmpd-oid-daemon.sh +++ b/snmpd-oid-daemon.sh @@ -566,7 +566,7 @@ declare -A pidtable first_run=true while :; do # Check if main is still alive and exit otherwise. - ps -p $main_pid > /dev/null || break + ps -p $main_pid >/dev/null || break [ -v EPOCHSECONDS ] && now=$EPOCHSECONDS || now=$(date +%s) for func in "${!DATA_FUNCS[@]}"; do @@ -600,16 +600,20 @@ while :; do fi data=$(timeout 1 cat <&$fd) rc=$? + eval "exec $fd>&-" + fdtable[$func]=-1 pid=${pidtable[$func]} if (( rc == 124 )); then echo "gathering: timeout receiving data from $func (PID $pid, FD $fd), killing process" >&2 - kill -9 $pid + kill -SIGTERM $pid + sleep 1 + ps -p $pid >/dev/null && kill -SIGKILL $pid + rc=137 + else + wait $pid + rc=$? fi - wait $pid - rc=$? - echo "gathering: $func exited (rc = $rc)" >&$DEBUGLOG - eval "exec $fd>&-" - fdtable[$func]=-1 + echo "gathering: $func (PID $pid, FD $fd) exited with rc = $rc" >&$DEBUGLOG if (( rc == 0 )) && [ -n "$data" ]; then echo "gathering: sending data to main" >&$DEBUGLOG echo "$data" 1>&$DATAIN