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