Как обрабатывать SIGKILL в bash-скрипте используется tcpdump - PullRequest
0 голосов
/ 28 марта 2019

У меня проблема с передачей сигналов типа SIGKILL, SIGINT, SIGTERP в bash-скрипт, использующий tcpdump.

Основная проблема - как убить процесс tcpdump (child), если homeone убивает основной скрипт.

У меня есть следующий скрипт (часть):


#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, все еще существует.

Я бы хотел вызвать функцию stop_tcpdump и завершить дочерний процесс tcpdump, если скрипт получит один из сигналов (SIGINT SIGKILL SIGTERM SIGSTOP).

И сделал это с помощью trap:

trap stop_tcpdump SIGINT SIGKILL SIGTERM SIGSTOP

Но это не сработает.

Кто-нибудь знает, как обрабатывать сигнал и уничтожать дочерний процесс (tcpdump), когда кто-то уничтожает основной скрипт?

1 Ответ

0 голосов
/ 28 марта 2019

Некоторые сигналы обычно не могут быть заблокированы.Хотя существуют способы сделать процесс невозможным для уничтожения, он сложен, плохая идея и, вероятно, бесполезен.

Один простой способ - добавить задание at для очистки, если он обнаружит, что скрипт завершился (или он всегда может выполнять части check_tcpdump и stop_tcpdump.

Еще один более сложный вариант - переплетать сценарий с другим - они могут контролировать друг друга и выполнять очистку при выходе любого из них (ср. Робин Гуд и монах )

...