我有一台Linux
每 10MB 进行日志轮换的服务器。我想将完成的文件全部scp
或rsync
部分存储到远程存储。
是否可以rsync
持续接收最新文件,这样rsync
在新的日志文件轮换后就会发生这种情况?
我的文件命名例如:
trace_00003_20190207134624.pcap
trace_00004_20190207144533.pcap
trace_00005_20190207154446.pcap
因此在这种情况下trace_00005_20190207154446.pcap
会被主动写入并且不应该被捕获rsync
。
答案1
如果您可以更改日志原始文件的名称,那么您可以轻松完成此操作。我假设您使用 logrotate 来轮换日志文件。
- 配置您的应用程序以使用不同的结尾保存日志文件,例如
.pcap.current
.pcap
配置 logrotate在旋转时重命名文件- rsync 仅同步以以下格式结尾的文件
.pcap
无需使用任何查找或其他过滤器的技巧。
答案2
我会进行实验find
,看看你是否可以保留 15 分钟内更新的文件。例如:
# only rsync files older than 15 minutes
rsync -av $(find /var/pcap_dir/ -type f -mmin +15 | xargs) /tmp/dest/
我确实记得一次处理的文件数量有限制,xargs
所以你可能需要查一下。如果我没记错的话,这个数量已经达到数千个,所以处理少量文件应该没问题。此外,文件名中的空格或 shell 元字符可能会搞砸事情,所以一定要使用 shell 安全的文件名。
编辑:或者只是传输一个脚本(未经测试)
#!/bin/bash
# myscript.sh find files 15 minutes old, or older. tar them up with bzip2 compression
find /var/pcap_dir/ -type f -mmin +15 | xargs tar cfj /tmp/results.tbz --files-from -
然后远程运行脚本将 tarball 拉到本地机器:
scp myscript.sh remotehost:/tmp/
ssh remotehost "/tmp/myscript.sh"
scp remotehost:/tmp/results.tbz /tmp/
ssh remotehost "rm -f /tmp/results.tbz"
答案3
对于以您的示例命名的文件,此代码将允许您对除最新文件之外的所有文件执行任何操作 - 但要小心,因为在随机文件组中它可能匹配的不仅仅是最后一个文件。
for file in `ls | grep -v \`ls -ltr | tail -1 | awk '{ print $9 }'\``; do echo $file;
done
此示例仅打印出名称;用 rsync 命令替换 echo $file。
测试:
[pt@NDC1ASCEM2DES1 test]$ ll
total 0
-rw-r--r-- 1 pt868x sysadmin 0 Feb 20 17:00 trace_00005_20190207154446.pcap
-rw-r--r-- 1 pt868x sysadmin 0 Feb 20 17:00 trace_00003_20190207134624.pcap
-rw-r--r-- 1 pt868x sysadmin 0 Feb 20 17:01 trace_00004_20190207144533.pcap
[pt@NDC1ASCEM2DES1 test]$ for file in `ls | grep -v \`ls -ltr | tail -1 | awk '{ print $9 }'\``; do echo $file; done
trace_00003_20190207134624.pcap
trace_00005_20190207154446.pcap
[pt@NDC1ASCEM2DES1 test]$ for file in `ls | grep -v \`ls -ltr | tail -1 | awk '{ print $9 }'\``; do rsync $file NDC1ASCEM2DES2:$file; done
pt@ndc1ascem2des2's password:
pt@ndc1ascem2des2's password:
[pt@NDC1ASCEM2DES1 test]$ ssh ndc1ascem2des2 "ls"
pt@ndc1ascem2des2's password:
trace_00003_20190207134624.pcap
trace_00005_20190207154446.pcap
答案4
你的问题有点模棱两可。我来解释一下:
选项 1:备份所有大于或等于 10MB 的文件。
选项 2:备份所有文件除了具有最新时间戳的那个。
我假设你指的是选项 1:选项 1 答案。
你可以使用寻找命令抓取每个大于 10MB 的文件并将该文件发送到scp/rcp命令。 注意
find path -type f -size +10M -exec scp {} destination \;
\;在最后。别忘了!
选项 2 答案。
在 csh 中测试过这个 &狂欢
ls -rt [path]/[file_wildcard] | sed '$d' | xargs -i rm -f {}