我已经使用cstream
它一段时间了,用于很多事情,例如减少mysqldump
对驱动器的影响。但是,我总是通过直接从脚本或 cronjob 调用二进制文件来实现这一点。
cstream
我现在遇到了一种情况,如果我可以使用,那就太好了logrotate
,但经过几次尝试后,我无法让它工作。
您可以cstream
通过两种不同的方式使用:
作为“cat”二进制文件
cstream foo | gzip
作为来自另一个进程的管道
mysqldump foo | cstream > dump.sql
更准确地说,我想cstream
从compresscmd
选项中调用。
现在我只是在logrotate
配置文件中使用它。
compresscmd /bin/gzip
compressoptions -9
但就像我说的,我想用类似
compresscmd cstream foo | gzip
这可能吗?我可以使用配置文件中的变量/宏,logrotate
以便传递要压缩的文件的信息cstream
吗?
另外,我尝试使用compresscmd
shell 脚本来打印脚本接收的参数,但我只看到一个参数的值为 -9
所以,实际上我不知道如何gzip
获取该信息。它是否来自某些仅可用的 bash 环境值logrotate
?
我已看过logrotate
的文档,但没有找到任何可以解答我疑问的答案。
有人可以解释一下吗?
答案1
看起来 logrotate 正在通过管道传输到 compresscmd,因此您需要编写一个可以处理管道的脚本。我确信 perl/python 可以提供更优雅的解决方案,但以下是我在 bash 中拼凑起来的:
和
compresscmd /root/mycompress.bash
我的压缩.bash:
#!/bin/bash
## set the field separator to NULL
IFS=''
## read the pipe into an array
ARRAY=()
while read LINE
do
ARRAY+=($LINE)
done
## echo the array and pipe to desired commands
for item in ${ARRAY[*]}
do
echo $item
done | cstream | gzip -9
更新:
经过思考,发现使用数组进行临时存储是没有必要的,因此上述代码可以简化为:
#!/bin/bash
## set the field separator to NULL
IFS=''
while read LINE
do
echo $LINE
done | cstream
经过进一步思考,由于 cstream 本身可以很好地处理管道,因此 mycompress.bash 可以简化为:
#!/bin/bash
cstream | gzip