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

时间:2019-03-28 08:32:42

标签: linux bash tcpdump

我在将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 stop_tcpdump SIGINT SIGKILL SIGTERM SIGSTOP

但这不起作用。

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

1 个答案:

答案 0 :(得分:0)

通常无法阻止某些信号。尽管有多种方法可以使过程不可杀灭,但这是棘手的,一个坏主意,并且可能无济于事。

一个简单的选项是添加一个at作业,以在其检测到脚本已退出时执行清理(或者它可以始终执行check_tcpdumpstop_tcpdump部分)。

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