logrotate压缩参数

logrotate压缩参数

我已经使用cstream它一段时间了,用于很多事情,例如减少mysqldump对驱动器的影响。但是,我总是通过直接从脚本或 cronjob 调用二进制文件来实现这一点。

cstream我现在遇到了一种情况,如果我可以使用,那就太好了logrotate,但经过几次尝试后,我无法让它工作。

您可以cstream通过两种不同的方式使用:

  • 作为“cat”二进制文件

    cstream foo | gzip

  • 作为来自另一个进程的管道

    mysqldump foo | cstream > dump.sql

更准确地说,我想cstreamcompresscmd选项中调用。

现在我只是在logrotate配置文件中使用它。

compresscmd /bin/gzip
compressoptions -9

但就像我说的,我想用类似

compresscmd cstream foo | gzip

这可能吗?我可以使用配置文件中的变量/宏,logrotate以便传递要压缩的文件的信息cstream吗?

另外,我尝试使用compresscmdshell 脚本来打印脚本接收的参数,但我只看到一个参数的值为 -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

相关内容