如何安排tcpdump在特定时间段运行?

64

每次我手动运行tcpdump时,都需要使用Ctrl+C来停止它。现在我想用cronjob安排我的tcpdump,并且我只需要它运行1个半小时。没有手动运行Ctrl+C或kill命令,如何自动停止它?这是我正在测试的命令:

tcpdump -i eth0 'port 8080' -w  myfile

我可以安排另一个cronjob来终止tcpdump进程,但这似乎不是一个好主意。


tcpdump的任何答案都可以,一个适用于任何程序(除非他们干扰SIGALRM)的解决方案是来自http://www.superscript.com/signal/index.html的sigalarm程序。 - loreb
5个回答

88
你可以结合-G{秒数}(每隔x秒轮流转储dump文件)和-W{数量}(限制dump文件数量)来获得你想要的结果:
tcpdump -G 15 -W 1 -w myfile -i eth0 'port 8080'

这个程序会运行15秒,然后停止。把1.5小时转换成秒就可以让它正常工作。


38
请注意:如果您没有任何流量,则此技巧无效。 - nibot
1
是的,tcpdump在收到数据包之前不会旋转、关闭或执行任何操作。 - Yotam Alon
3
使用命令-w myfile-%Y-%m-%d_%H.%M.%S。通过使用-w myfile,tcpdump会在指定的时间间隔后不断地覆盖同一个文件。为了避免覆盖文件,你必须提供一个带有时间格式的文件名,这个时间格式可以通过strftime来指定。 - rajneesh2k10

87

你可以使用超时

timeout 5400 tcpdump -i eth0 'port 8080' -w myfile

这看起来更简单和更高效。 - Alireza
8
“timeout 90m” 更容易让人阅读。 - phs
这个更安全,因为如果涉及的接口没有流量,tcpdump -G 将无限期运行。 - Max Doronin

24

你可以这样做:

tcpdump -i eth0 'port 8080' -w  myfile & 
pid=$!
sleep 1.5h
kill $pid

如果您有一个单独的tcpdump实例,您可以使用“pkill tcpdump”。 - Aditya

5
我在Ubuntu 14.04上最有效的方法是:
sudo -i
crontab -e

然后添加这行代码。
30 17 * * * /usr/sbin/tcpdump -G 12600 -W 1 -s 3000 -w /home/ubuntu/capture-file.pcap port 5060 or portrange 10000-35000

注意事项

  • -G标志表示转储运行的秒数,本示例每天从下午5:30到晚上9:00运行
  • -W是tcpdump将执行的迭代次数
  • 直到保存并退出文件后,才会添加定期任务
  • 此示例用于捕获Asterisk电话服务器的数据包

-7

你可以使用

watch tcpdump -i eth0 'port 8080' -w  myfile

这将每2秒运行一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接