为什么 tcpdump 不在后台运行?

And*_*ski 3 linux shell tcpdump nohup

我通过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

Run Code Online (Sandbox Code Playgroud)

结果应该是 tcpdump 在后台运行,将命令结果重定向到 file_result。

该脚本的调用方式为:

nohup $SCRIPT_NAME $CFG_FILE start &
Run Code Online (Sandbox Code Playgroud)

并且它停止调用 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
Run Code Online (Sandbox Code Playgroud)

当我检查 file_result 时,运行停止脚本后,它是空的。

怎么了?我该如何解决?

我找到了这个链接:https://it.toolbox.com/question/launching-tcpdump-processes-in-background-using-ssh-060614

作者似乎也遇到过类似的问题。他们争论竞争条件,但我并不完全理解。

Chr*_*ard 9

我不确定您想要通过让启动脚本本身继续运行来完成什么,但我认为这里有一种方法可以完成您想要做的事情,即启动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 &

# 将tcpdump的PID写入文件
回声$!> /var/run/tcpdump.pid

脚本#2:tcpdump_stop.sh

#!/bin/sh
如果 [ -f /var/run/tcpdump.pid ]
然后
        杀死 `cat /var/run/tcpdump.pid`
        echo tcpdump `cat /var/run/tcpdump.pid` 被杀死。
        rm -f /var/run/tcpdump.pid
别的
        echo tcpdump 未运行。
菲

要启动tcpdump,只需运行tcpdump_start.sh.
要停止以 启动的tcpdumptcpdump_start.sh实例,只需运行tcpdump_stop.sh

捕获的数据包将写入file_result.pcap文件,是的,它是一个 pcap 文件,而不是文本文件,因此使用正确的文件扩展名命名它会有所帮助。当tcpdump终止时 tcpdump统计信息将写入nohup.out文件。