У меня проблема с передачей сигналов типа 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), когда кто-то уничтожает основной скрипт?