Назад | Перейти на главную страницу

параметры сжатия logrotate

Я использовал cstream на некоторое время для многих вещей, например, чтобы уменьшить влияние, которое mysqldump есть на дисках. Однако я всегда делал это, вызывая двоичный файл непосредственно из скрипта или cronjob.

У меня сейчас одна ситуация, в которой было бы здорово, если бы я мог использовать cstream из logrotate, но после некоторых испытаний я не могу заставить его работать.

Ты можешь использовать cstream двумя разными способами:

Точнее я хотел бы позвонить 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