我一直在使用cstream很多事情,例如为了减lessmysqldump对驱动器的影响。 不过,我总是通过直接从脚本或cronjob调用二进制文件来完成此操作。
我现在有一种情况,如果我可以使用logrotate cstream ,但是经过一些试验,我无法得到它的工作。
你可以用两种不同的方式使用cstream :
作为“猫”二进制
cstream foo | gzip
作为来自另一个过程的pipe道
mysqldump foo | cstream > dump.sql
更确切地说,我想从compresscmd选项中调用cstream 。
现在我只是在logrotateconfiguration文件中使用这个。
compresscmd /bin/gzip compressoptions -9
但就像我说的,我想用类似的东西
compresscmd cstream foo | gzip
那可能吗? 我可以使用logrotateconfiguration文件中的variables/macros,以便我可以传递文件的信息压缩到cstream ?
另外,我尝试使用带有脚本的compresscmd来打印脚本收到的参数,但是我只看到一个参数值为= -9
所以,实际上我不知道gzip是如何获取这些信息的。 它是否只能从logrotate获得一些bash env值?
我看了一下logrotate的文档,但是我看不出有什么答案。
任何人都可以对此有所了解吗?
看起来像logrotatepipe道压缩cmd,所以你需要写一个脚本,可以处理pipe道。 我确信perl / python可以提供一个更优雅的解决scheme,但是这里是我能够在bash中拼凑起来的东西:
同
compresscmd /root/mycompress.bash
mycompress.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自己处理pipe道就好了,mycompress.bash可以简化为:
#!/bin/bash cstream | gzip