gpt4 book ai didi

linux - 如何在使用 tcpdump 的 bash 脚本中处理 SIGKILL

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:10 24 4
gpt4 key购买 nike

我在将 SIGKILL、SIGINT、SIGTERP 等信号传递给使用 tcpdump 的 bash 脚本时遇到问题。

主要问题 - 如果 homeone 终止主脚本,如何终止 tcpdump 进程(子进程)。

我有以下脚本(部分):


#for log
function log {
echo "$CURRENT_DATE_TIME $1" >> "${LOG_DIR}/${MAIN_LOG_FILE}"
echo "$1"
}

#to start tcpdump
function start_tcpdump {
${TCPDUMP} ${TCPDUMP_ARGS} ${TCPDUMP_LOG_FILE} ${TCPDUMP_SMPP_PDU} &
TCPDUMP_PID=$!
log "Start tcpdump PID: ${TCPDUMP_PID}"
sleep 60

}

#to stop tcpdump
function stop_tcpdump {
kill -s 2 ${TCPDUMP_PID}
log "Stop tcpdump PID ${TCPDUMP_PID}"
TCPDUMP_PID=0
}

#check if process exists
function check_tcpdump {
if [[ ${TCPDUMP_PID} -ne 0 ]] && [[ -e /proc/${TCPDUMP_PID} ]] && kill -s 0 "${TCPDUMP_PID}" 2>/dev/null
then
log "Checking tcpdump. Already started PID ${TCPDUMP_PID}"
return 1
else
log "Checking tcpdump. Not started"
return 0
fi
# [[ ${TCPDUMP_PID} -ne 0 ]] && [[ -e /proc/${TCPDUMP_PID} ]] && kill -s 0 "${TCPDUMP_PID}" 2>/dev/null
}

#main function here
function main {
log "#####INIT#####"
start_tcpdump

trap stop_tcpdump SIGINT SIGKILL SIGTERM SIGSTOP
check_tcpdump
stop_tcpdump
}

main

但是如果有人忘记并杀死 sript:

$ sh ./gms_trace_smpp.sh

$ kill $pid

管理 tcp 转储的进程仍然存在。

如果脚本收到信号之一 (SIGINT SIGKILL SIGTERM SIGSTOP),我想调用 stop_tcpdump 函数并终止子 tcpdump 进程。

并使用 trap 实现了它:

trap stop_tcpdump SIGINT SIGKILL SIGTERM SIGSTOP

但它不起作用。

有人知道当有人杀死主脚本时如何处理信号并杀死子进程(tcpdump)吗?

最佳答案

有些信号通常无法被屏蔽。虽然有一些方法可以使进程无法终止,但这很棘手,是个坏主意,而且可能没有帮助。

一个简单的选择是添加一个 at 作业来执行清理,如果它检测到脚本已经退出(或者它总是可以执行 check_tcpdumpstop_tcpdump部分)。

另一个更复杂的选择是将脚本与另一个脚本交织在一起 - 它们可以相互监视并在其中一个退出时执行清理(参见 Robin Hood and Friar Tuck )

关于linux - 如何在使用 tcpdump 的 bash 脚本中处理 SIGKILL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55393120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com