Я могу использовать logrotate для сжатия ежедневно (названная дата) журналов?

Конец комментариев в первой новой строке (см. маркерное правило 10 распознавания оболочки), не позволяя строки продолжения, таким образом, этот код имеет foo в отдельной командной строке:

echo # this is a comment \
foo

Что касается Вашего первого предложения, обратная косая черта не сопровождается новой строкой, Вы просто заключаете пространство в кавычки: это эквивалентно

echo ' # this is a comment'
foo

$(: this is a comment) заменяет выводом команды : this is a comment. Если вывод той команды пуст, это - эффективно очень запутывающий способ вставить комментарий посреди строки.

Нет никакого волшебного продолжения: : обычная команда, утилита двоеточия, которая ничего не делает. Утилита двоеточия главным образом полезна, когда синтаксис оболочки требует команды, но Вам, оказывается, нечего делать.

# Sample code to compress files that don't look compressed
case "$1" in
  *.gz|*.tgz|*.bz2|*.zip|*.jar|*.od?) :;; # the file is already compressed
  *) bzip2 -9 "$1";;
esac

Другой вариант использования является идиомой для установки переменной, если это уже не установлено.

: "${foo:=default value}"

Комментарий о goto является историческим. Утилита двоеточия датируется от даже перед Оболочкой Bourne, полностью к оболочке Thompson, которая имела goto инструкцию. Двоеточие затем означало маркировку; двоеточие является довольно общим синтаксисом для маркировок goto (оно все еще присутствует в sed).

8
24.06.2011, 12:54
3 ответа

Вот беглый сценарий, который сделает то, в чем Вы нуждаетесь:

#!/bin/bash
LOGDIR=/var/log/somedir
OLDLOGS=/var/log/keep-old-logs-here
PATH=/bin:$PATH
TODAY=$(date +'%Y%m%d')

[ -d $OLDLOGS ] || mkdir -p $OLDLOGS

cd $LOGDIR

for LOG in $(ls | egrep '^[[:digit:]]{8}$'); do
    [ $LOG -lt $TODAY ] && gzip $LOG && mv $LOG.gz 
done

Сделайте исполняемый файл сценария:

$ chmod +x /where/you/put/this/script

crontab запись будет похожа:

30 0 * * * /where/you/put/this/script

Просто корректируйтесь LOGDIR и OLDLOGDIR. В 0:30 это переместится, все входит в систему формат YYYYMMDD для предыдущего (и ранее, если таковые имеются) дни.

4
27.01.2020, 20:12
  • 1
    Да, но это действительно не отвечает на мой вопрос. Мой вопрос состоял в том, могу ли я использовать logrotate для этого. –  Let_Me_Be 24.06.2011, 14:04
  • 2
    @Let_Me_Be - Я думал, что это было неявно в моем ответе. Нет, logrotate не сделает точно, что Вы хотите. Таким образом, можно не только соответствовать файлам YYYYMMDD. Иначе можно приблизиться при помощи nodateext, olddir, compress, и daily опции. большое спасибо –  unpythonic 24.06.2011, 14:26

logrotate самостоятельно не делает этого. Я рекомендовал бы писать дополнительный сценарий и вызвать его от logrotate использование postrotate опция в конфигурации.

2
27.01.2020, 20:12

logrotate может сделать это с olddir, если Ваше имя файла журнала является тем же каждым разом, когда это работает, и можно добавить даты. Если Ваши смены имени файла журнала т.е. YYYYMMDD затем logrotate не сделают этого для Вас.

# sample logrotate conf file
copytruncate
compress
dateformat %Y%m%d.
dateext
extension log
olddir ./logarchive

/logs/sys.log {
    rotate 7
    daily
}

Копии и gzips /logs/sys.log к/logs/logarchive/sys.20120101.log.gz, сохраняет одну недельную ценность журналов.

3
27.01.2020, 20:12
  • 1
    Это не ответ. Журналы уже имеют метки даты и эффективно повернуты, Let_Me_Be просто хочет сжать их. Я полагаю, что @jmtd является правильным. –  andrew lorien 07.04.2017, 04:22

Теги

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