首页 > 解决方案 > 为什么 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

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

怎么了?我该如何解决?

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

作者似乎遇到了类似的问题。他们辩论比赛条件,但我并不完全理解。

标签: linuxshelltcpdumpnohup

解决方案


我不确定您要通过让启动脚本本身继续运行来完成什么,但我认为这是一种方法可以完成您正在尝试做的事情,即启动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文件。


推荐阅读