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

Я использовал 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документация, но я не вижу ответа на свои сомнения.

Кто-либо может пролить некоторый свет на это?

2
задан 1 August 2015 в 06:58
1 ответ

Похоже, что 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
1
ответ дан 3 December 2019 в 12:45

Теги

Похожие вопросы