blockcheck2.sh: temp files sweeper fix

This commit is contained in:
bol-van committed 2026-10-20 09:56:13 +03:00
1 parent a0c928be45
commit 299f833f39
1 file changed
+32 -28
+32 -28
View File
@@ -63,34 +63,10 @@ IPFW_RULE_NUM=${IPFW_RULE_NUM:-$(($$ % $IPFW_RULE_MAX + 1))}
IPFW_DIVERT_PORT=${IPFW_DIVERT_PORT:-$(($$ % 64536 + 1000))} IPFW_DIVERT_PORT=${IPFW_DIVERT_PORT:-$(($$ % 64536 + 1000))}
QNUM=${QNUM:-$(($$ % 64536 + 1000))} QNUM=${QNUM:-$(($$ % 64536 + 1000))}
PARALLEL_OUT=/tmp/zapret_parallel_$$ PARALLEL_OUT_TEMPLATE=/tmp/zapret_parallel_
HDRTEMP=/tmp/zapret-hdr-$$ PARALLEL_OUT=$PARALLEL_OUT_TEMPLATE$$
HDRTEMP_TEMPLATE=/tmp/zapret-hdr-$$
sweep_stale_pidfiles() HDRTEMP=$HDRTEMP_TEMPLATE$$
{
# $1 - fixed filename prefix immediately preceding the pid
#
# A normal exit already removes this run's own PARALLEL_OUT/HDRTEMP
# files (unprepare_all(), further down), which covers Ctrl+C,
# a closed terminal, and a plain kill. kill -9 and crashes bypass
# that, as they would for any script's cleanup, and can leave
# stale files behind indefinitely, since nothing about a later run
# gives it any reason to know about a different PID's leftovers.
# Removes a matching file only once its PID (the run that created
# it) is confirmed no longer running, so a genuinely still-running
# concurrent instance - a different PID, its own files - is never
# touched.
local f pid prefix="$1"
for f in "$prefix"*; do
[ -e "$f" ] || continue
pid=${f#"$prefix"}
pid=${pid%%[!0-9]*}
[ -n "$pid" ] || continue
kill -0 "$pid" 2>/dev/null || rm -f "$f"
done
}
sweep_stale_pidfiles /tmp/zapret_parallel_
sweep_stale_pidfiles /tmp/zapret-hdr-
NFT_TABLE=blockcheck$$ NFT_TABLE=blockcheck$$
IPT_OUT_CHAIN=blockcheck_output_$$ IPT_OUT_CHAIN=blockcheck_output_$$
@@ -1951,6 +1927,32 @@ check_dns()
return $r return $r
} }
sweep_stale_pidfiles()
{
# $1 - fixed filename prefix immediately preceding the pid
#
# A normal exit already removes this run's own PARALLEL_OUT/HDRTEMP
# files (unprepare_all(), further down), which covers Ctrl+C,
# a closed terminal, and a plain kill. kill -9 and crashes bypass
# that, as they would for any script's cleanup, and can leave
# stale files behind indefinitely, since nothing about a later run
# gives it any reason to know about a different PID's leftovers.
# Removes a matching file only once its PID (the run that created
# it) is confirmed no longer running, so a genuinely still-running
# concurrent instance - a different PID, its own files - is never
# touched.
local f pid prefix="$1"
for f in "$prefix"*; do
[ -e "$f" ] || continue
pid=${f#"$prefix"}
pid=${pid%%[!0-9]*}
[ -n "$pid" ] || continue
kill -0 "$pid" 2>/dev/null || rm -f "$f"
done
}
block_signals() block_signals()
{ {
# prevent signal function reenter # prevent signal function reenter
@@ -2003,6 +2005,8 @@ fix_sbin_path
check_system check_system
check_already check_already
[ "$UNAME" != CYGWIN -a "$SKIP_PKTWS" != 1 ] && require_root [ "$UNAME" != CYGWIN -a "$SKIP_PKTWS" != 1 ] && require_root
sweep_stale_pidfiles $PARALLEL_OUT_TEMPLATE
sweep_stale_pidfiles $HDRTEMP_TEMPLATE
check_prerequisites check_prerequisites
trap sigint_cleanup INT trap sigint_cleanup INT
check_dns check_dns