我有一个问题是将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
但如果有人忘记并杀死脚本:
$ sh ./gms_trace_smpp.sh
$ kill $pid
管理tcp转储的进程仍然存在。
如果脚本获得其中一个信号(SIGINT SIGKILL SIGTERM SIGSTOP),我想调用stop_tcpdump函数并终止子tcpdump进程。
并使用陷阱:
trap stop_tcpdump SIGINT SIGKILL SIGTERM SIGSTOP
但它不起作用。
当有人杀死主脚本时,有人知道如何处理信号并杀死子进程(tcpdump)吗?
有些信号通常无法阻止。虽然有一些方法可以使流程不可销售,但它很棘手,一个坏主意,可能没什么用处。
一个简单的选择是添加一个at
作业来执行清理,如果它检测到脚本已经退出(或者它总是可以执行check_tcpdump
和stop_tcpdump
部分)。
另一个更复杂的选择是将脚本与另一个脚本交织在一起 - 当任何一个退出时,它们可以相互监视并执行清理(参见Robin Hood and Friar Tuck)