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
作者似乎也遇到过类似的问题。他们争论竞争条件,但我并不完全理解。
我不确定您想要通过让启动脚本本身继续运行来完成什么,但我认为这里有一种方法可以完成您想要做的事情,即启动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文件。
| 归档时间: |
|
| 查看次数: |
15437 次 |
| 最近记录: |