Почему tcpdump не работает в фоновом режиме? - PullRequest
0 голосов
/ 03 апреля 2020

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

#!/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

Когда я проверяю file_result, после работает скрипт остановки, он пустой.

Что происходит? Как я могу решить эту проблему?

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

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

1 Ответ

0 голосов
/ 06 апреля 2020

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

Script # 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 .

...