Как реализовать Logrotate в сценарии оболочки

12

test.sh

#!/bin/bash
echo "Hello World"

test2.sh

#!/bin/bash
while true
do
    sh test.sh >> /script_logs/test.log &
done

Я хочу реализовать logrotate для управления размером файла журнала, так как же реализовать logrotate, если ситуация похожа на описанную выше?

Веерендра
источник

Ответы:

11
#!/bin/bash 
touch /script_logs/test.log
MaxFileSize=2048
while true
do
     sh test.sh >> /script_logs/test.log
#Get size in bytes** 
    file_size=`du -b /script_logs/test.log | tr -s '\t' ' ' | cut -d' ' -f1`
    if [ $file_size -gt $MaxFileSize ];then   
        timestamp=`date +%s`
        mv /script_logs/test.log /script_logs/test.log.$timestamp
        touch /script_logs/test.log
    fi

done

Я удалил «&», так как это может вызвать проблему.

любопытный
источник
@Veerendra, нам нужно поместить логику сворачивания бревен внутри цикла, когда вы выполняете бесконечный цикл ..
любопытно
@Veerendra у нас в предыдущем посте была ошибка .. "mv" не создаст новый файл, но вы можете изменить скрипт в соответствии с вашими требованиями.
любопытно
Итак, вместо cpи mv, могу ли я удалить файл журнала, затем будет ли он новый файл журнала с тем же именем? (Мое требование: если файл журнала достигнет определенного предела, я хочу удалить этот файл журнала, а затем создать новый файл )
Veerendra
Вы должны использовать, >>чтобы добавить к файлу журнала, >будет перезаписывать его снова и снова.
Alcik
если я использую >, я получаю tail: test.log: file truncated Hello World!.... Если я использую >>, я получаю правильное сообщение журнала, но размер файла увеличивается. Нет условия проверки состояния ...
;-(
24

как насчет использования savelog?

Он доступен в Debian и RH, и почти во всех остальных дистрибутивах Linux, о которых я знаю. Это скрипт оболочки / bin / sh, поэтому должен работать и на любом другом Unix.

например, прежде чем писать что-либо для test.logзапуска savelog -n -c 7 test.log. Это сохранит 7 самых последних непустых версий test.log. По умолчанию он сжимает повернутые логи (но это можно отключить с помощью -l).

Если вам нужно, вы можете проверить размер test.logи только savelogего, если он превышает определенный размер.

саз
источник
Любая идея, какой пакет содержит это на AWS Linux (я думаю, близко к CentOS)? Установка по умолчанию не имеет savelog. Я не могу найти его из yum, используя репозитории по умолчанию
jhonkola 25.02.16
savelog не найден в RHEL 5. Знаете ли вы, в каком репо он должен быть?
Фелипе Альварес
ни малейшего представления о CentOS или RHEL5 упаковки, но вы можете найти /usr/bin/savelogскрипт на sources.debian.net/src/debianutils/4.7
КАС
2
Я не нашел savelogни в одном из своих RHEL / CentOS 5/6 ящиков, поэтому я только что скачал его ad hoc, и, похоже, он отлично работает для моих нужд.
Дейл Андерсон
Недостатком savelogявляется то, что он переименовывает файл, но затем занимает много времени, чтобы сжать старые, прежде чем закончить. Между тем журнал .0 уже получает записи следующих дней. В идеале время между ротацией журнала и сигналом процесса повторного открытия журнала должно быть минимальным. Из-за этого я отключаю функцию savelogсжатия.
rustyx
2

Я написал logrotee в эти выходные. Я бы не стал, если бы прочитал замечательный ответmultilog @ JdeBP .

Я сосредоточился на том, чтобы он был легким и имел возможность bzip2 его выходных блоков, таких как:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

Однако многое еще предстоит сделать и проверить.

Виктор Сергиенко
источник
0

Поскольку я пока не могу добавить комментарии к принятому ответу , подсказка BusyBox , где duнет -bфлага:

du /var/log/file | tr -s '\t' ' ' | cut -d' ' -f1
lnksz
источник