Почему tcpdump не работает в фоновом режиме?

Я вошел в виртуальную машину через ssh и попытался запустить скрипт в фоновом режиме, скрипт показан ниже:

#!/bin/bash
APP_NAME=`basename $0`
CFG_FILE=$1
. $CFG_FILE #just some variables
CMD=$2
PID_FILE="$PIDS_DIR/$APP_NAME.pid"
CUR_LOG_DIR=$LOGS_RUNNING

echo $$ > $PID_FILE

#Main script code

#This script shall be called using the following syntax
# $ nohup script_name output_dir &

TIMESTAMP=`date +"%Y%m%d%H%M%S"`

CAP_INTERFACE="eth0"

/usr/sbin/tcpdump -nei $CAP_INTERFACE -s 65535 -w file_result

rm $PID_FILE

В результате tcpdump должен работать в фоновом режиме, перенаправляя результат команды в file_result.

Скрипт вызывается с:

nohup $SCRIPT_NAME $CFG_FILE start &

И остановлен вызов STOP_SCRIPT:

##STOP_SCRIPT
PID_FILE="$PIDS_DIR/$APP_NAME.pid"

if [ -f $PID_FILE ]
then
  PID=`cat $PID_FILE`

  # send SIGTERM to kill all children of $PID
  pkill -TERM -P $PID
fi

Когда я проверяю файл_результата после запуска сценария остановки, он пуст.

Что случилось? Как я могу это решить?

Я нашел эту ссылку: https://it.toolbox.com/question/launching-tcpdump-processes-in-background-using-ssh-060614

Похоже, автор столкнулся с похожей проблемой. Они спорят об условиях гонки, но я не совсем понял.


person André Machoski    schedule 03.04.2020    source источник
comment
Нет, это не так. Но это должно работать, переданные команды ничего не меняют.   -  person André Machoski    schedule 04.04.2020
comment
Скрипт вызывается через символ '&', забыл. Я обновлю вопрос.   -  person André Machoski    schedule 04.04.2020


Ответы (2)


Я не уверен, чего вы пытаетесь достичь, продолжая работать сам сценарий запуска, но вот подход, который, я думаю, выполняет то, что вы пытаетесь сделать, а именно start tcpdump и по-прежнему невосприимчив к зависаниям через nohup. Я немного упростил для наглядности — не стесняйтесь добавлять любые переменные по своему усмотрению, например, выходной каталог nohup.out, TIMESTAMP и т. д.

Сценарий №1: tcpdump_start.sh

#!/bin/sh
rm -f nohup.out
nohup /usr/sbin/tcpdump -ni eth0 -s 65535 -w file_result.pcap &

# Write tcpdump's PID to a file
echo $! > /var/run/tcpdump.pid

Скрипт № 2: tcpdump_stop.sh

#!/bin/sh
if [ -f /var/run/tcpdump.pid ]
then
        kill `cat /var/run/tcpdump.pid`
        echo tcpdump `cat /var/run/tcpdump.pid` killed.
        rm -f /var/run/tcpdump.pid
else
        echo tcpdump not running.
fi

Чтобы запустить tcpdump, просто запустите tcpdump_start.sh.
Чтобы остановить экземпляр tcpdump, запущенный с помощью tcpdump_start.sh, просто запустите tcpdump_stop.sh.

Захваченные пакеты будут записаны в файл file_result.pcap, и да, это файл pcap, а не текстовый файл, поэтому полезно дать ему имя с правильным расширением. Статистика tcpdump будет записана в файл nohup.out при завершении работы tcpdump.

person Christopher Maynard    schedule 05.04.2020
comment
Привет Кристофер. Действительно, ваше решение работает. Однако я не понимаю, почему у меня нет. Я сделал несколько тестов, и с помощью моего метода процесс tcpdump завершается, когда скрипт завершает работу, даже вызывая скрипт с помощью символов «nohup» и «&». Спасибо за помощь. - person André Machoski; 06.04.2020

Я тоже сталкивался с проблемами при запуске tcpdump через сеанс SSH. В моем случае я бежал

sudo nohup tcpdump -w {pcap_dump_file} {filter} > /dev/null 2>&1 &

Где запуск этой команды через сеанс Paramiko SSH в качестве фонового процесса был проблемой.

Чтобы обойти это, я использовал утилиту screen в Linux. screen — это простой в использовании инструмент для длительного выполнения процессов как службы.

person Gautham M Vasisht    schedule 16.08.2020