我厌倦了试图找到答案。 我在crontab -e命令中有2个脚本。
START_TCPDUMP.sh
#!/bin/bash
tcpdump -i any port 3306 -s 65535 -x -nn -q -tttt> /etc/openvpn/logs/tcpdump_3306_"$(date +"%Y_%m_%d_%I_%M_%p")".out
STOP_TCPDUMP.sh
PID=$(/usr/bin/ps -ef | grep tcpdump | grep -v grep | grep -v ".sh" | awk '{print $2}')
/usr/bin/kill -9 $PID
CRONTAB -E
*/1 * * * * /etc/openvpn/script/STOP_TCPDUMP.sh
*/1 * * * * /etc/openvpn/script/START_TCPDUMP.sh
我已经尝试过更改并从第一行开始,但是都一样。
我每1分钟在目录中输出一次:
/etc/openvpn/logs/tcpdump_3306_2020_01_29_12_22_PM.out (empty: 0kb)
问题在于文件是空的,我已经尝试了很多东西,并且它总是空的。 我该如何解决?
如果我也运行:ps -e | grep tcpdump我得到0个结果。 但是如果我运行:grep | tcpdump我看到命令正在运行,并向我显示了所有跟踪的软件包。
我只希望它像3h一样运行,然后停止,保存文件,然后开始一个新文件。
每分钟一次的计划仅用于调试。
答案 0 :(得分:1)
在系统上每个kill
运行中的进程tcpdump
的代码都存在很大问题。您只想杀死cron
工作开始的人。切勿常规使用kill -9
;仅应在极端情况下使用。
多个useless grep
s也是难闻的气味,而且看起来非常脆。但是,让我们简单地删除该代码。
我的建议是只有一个脚本,该脚本可以杀死任何先前的实例并开始一个新的实例。
#!/bin/sh
logdir=/etc/openvpn/logs
exec >> "$logdir/cron.log" 2>&1
fmt="%Y_%m_%d_%I_%M_%p"
old=$(date -d "3 hours ago" +"$fmt")
new=$(date +"$fmt")
fuser -s -k -15 "$logdir/tcpdump_3306_$old.out"
tcpdump -i any port 3306 -s 65535 -x -nn -q -tttt>"$logdir/tcpdump_3306_$new.out"
这要小心,将所有消息重定向到单独的日志文件(否则cron
将向您发送带有输出的邮件),并且仅杀死附加到tcpdump
输出的先前实例的进程文件。 (为了进行测试,可能指定"$logdir"/tcpdump*.out
甚至是"$logdir"/*
,以确保您得到了一份干净的清单。)fuser
的默认信号是-9
;如果您确实需要,只需取出-15
。
fuser
应该是可移植的; date
更挑剔,在许多非Linux平台上没有-d
选项。您始终可以安装GNU Coreutils,或切换到简单的Perl或Python脚本进行时间戳计算。
答案 1 :(得分:0)
我只是想通了!
我更改了方法。我在crontab上创建了一个屏幕,它将每周每7天24小时运行一次。然后,我只输入文件,保存信息,然后清除文件,它将自动运行。
crontab -e
compute()
24点查询文件是一个python脚本,用于获取信息,将其保存在新文件中,然后截断它。
它将每2分钟重复一次(调试)。