我需要一些有关脚本/命令/cronjob 的帮助。
我需要将 tcpdump 命令的输出重定向到日志文件,并每天保留 1 个日志文件。我知道我可以使用 tcpdump 日志记录语法,但我还用它awk -F
来过滤输出。我的命令看起来像这样,并且单独运行效果很好。
tcpdump -ieth0 -p "tcp[tcpflags] & (tcp-syn) !=0" | awk -F 'Flags' '{print $1}' > /var/log/tcpdump.log
我怎样才能使它每天轮换文件?有没有办法用 shell 脚本来做(我的 shell 脚本知识非常有限)。
答案1
如果你不擅长编写 shell 脚本,我不会尝试编写自己的日志轮换。听起来你没有任何需要,使用日志旋转而不是自己动手。你可以制作一个简单的配置文件
# /etc/logrotate.d/tcpdump
"/var/log/tcpdump.log" {
daily
rotate 30
compress
prerotate
killall your_dump_script
endscript
postrotate
your_dump_script &
endscript
}
这会:
- 旋转文件
daily
- 保留
30
副本,因为你不想填满你的驱动器 compress
使用 gzip 节省磁盘空间。您可以使用zless
或zgrep
查看它们。- 在旋转之前将其终止
your_dump_script
,然后重新启动。您可以随意将其重命名为您更喜欢的名字。
如果你把它放进去/etc/logrotate.d
,它应该会被你内置的 cron 作业所接收,但如果你想手动运行它来验证它是否有效:
logrotate /etc/logrotate.d/tcpdump
或者将配置放在不同的位置并从脚本中运行。无论哪种方式,您编写的代码都更少,而且事情更有可能可靠地运行。
答案2
您可以利用rotatelogs
(文档在这里):您需要做的就是通过它传输输出,提供一些选项,它会处理剩下的事情。例如:
tcpdump ... | rotatelogs /var/log/tcpdump.log
当满足您指定的条件(文件大小、时间间隔)时将自动旋转输出文件。
答案3
我写了一个日志记录器这个周末。如果我读过@JdeBP 的很好的答案multilog
。
我专注于它的轻量级并且能够对其输出块进行 bzip2 处理,如下所示:
verbosecommand | logrotee \
--compress "bzip2 {}" --compress-suffix .bz2 \
/var/log/verbosecommand.log
不过,还有很多工作要做和测试。