Как обрабатывать SIGKILL в скрипте bash с использованием tcpdump

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

Основной вопрос - как убить процесс tcpdump (дочерний), если 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 stop_tcpdump SIGINT SIGKILL SIGTERM SIGSTOP

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

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

Из man trap «Реализации могут разрешать имена с префиксом SIG», но не могут. Удалите префиксы SIG из спецификации trap. | Если вы хотите выйти после получения сигнала, вызовите exit в обработчике trap.

KamilCuk 28.03.2019 09:36

Вы должны взглянуть на Что делает set -o errtrace в сценарии оболочки?

Inian 28.03.2019 10:16

SIGKILL и SIGSTOP не могут быть перехвачены!

Wiimm 28.03.2019 11:08

Если SIGKILL и SIGSTOP не могут быть перехвачены, как я могу также остановить процесс tcpdump в сценарии, если кто-то убьет этот сценарий? Может быть, у вас есть идея.

Vladimir Len 28.03.2019 13:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
661
1

Ответы 1

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

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

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

Другие вопросы по теме