Я использовал cstream
некоторое время для многих вещей, например, для сокращения влияния это mysqldump
имеет на дисках. Однако я всегда делал так путем вызова двоичного файла непосредственно из сценария или cronjob.
У меня есть одна ситуация теперь, в которой было бы замечательно, если я мог бы использовать cstream
от logrotate
, но после некоторых пробных версий, я не могу получить его работа.
Можно использовать cstream
двумя различными способами:
как двоичный файл "кошки"
cstream foo | gzip
как канал от другого процесса
mysqldump foo | cstream > dump.sql
Более точно я хотел бы звонить cstream
от compresscmd
опция.
Прямо сейчас я просто использую это в logrotate
файлы конфигурации.
compresscmd /bin/gzip
compressoptions -9
но как я сказал, я хотел бы использовать что-то как
compresscmd cstream foo | gzip
Это возможно? Я могу использовать переменные/макросы из logrotate
файлы конфигурации так, чтобы я мог передать информацию файла для сжатия до cstream
?
Кроме того, я пытался использовать compresscmd
со сценарием оболочки для печати аргументов, что сценарий получает, но я только видел один спор со значением =-9
Так, на самом деле я не знаю как gzip
берет ту информацию. Это от некоторого значения ENV удара, только доступного от logrotate
?
Я взглянул на logrotate
документация, но я не вижу ответа на свои сомнения.
Кто-либо может пролить некоторый свет на это?
Похоже, что logrotate передается по конвейеру к compresscmd, поэтому вам нужно написать сценарий, который может обрабатывать трубу. Я уверен, что perl / python может предоставить более элегантное решение, но вот то, что мне удалось сколотить в 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
update:
Поразмыслив, использование массива для временного хранения не требуется, поэтому приведенный выше код может быть уменьшен до:
#!/bin/bash
## set the field separator to NULL
IFS=''
while read LINE
do
echo $LINE
done | cstream
после дальнейшего размышления, поскольку cstream прекрасно обрабатывает каналы самостоятельно, mycompress.bash может быть уменьшен до:
#!/bin/bash
cstream | gzip