LINUX.ORG.RU
ФорумAdmin

Logrotate и скрипты prerotate


0

1

Добрый день.

Не могу понять в мане logrotate одну деталь. Logrotate позволяет помещать в конфигурационный файл произвольные команды, которые можно выполнять перед и/или после ротации логов (pre(post)rotate/endscript).

Для одиночных логов, имеющих персональные секции в конфиге, применение этих скриптов понятно - зная точно какой файл подлежит ротации, можно выполнить те или иные дополнительные операции, в.т.ч. и с самим файлом.

Так же понятно как использовать эти директивы в случае, если для ротации указывается wildcard И директива «sharedscripts». В этом случае выполняется некая команда до/после выполнения всех ротаций, относящихся к данной секции. Скажем, сделали ротацию всем log файлам апача и по окончании сообщили апачу, что логи очищены.

Вот чего я не могу понять, так это как можно скомбинировать pre(post)rotate и nosharedscripts. Было бы понятно, если бы можно было передать включённому скрипту при помощи переменной имя того конкретного файла, который logrotate собирается обработать. Но в документации об этом ничего не сказано. Вот выдержка из мана: «sharedscripts: Normally, prerotate and postrotate scripts are run for each log which is rotated, meaning that a single script may be run multiple times for log file entries which match multiple files (such as the /var/log/news/* example).» И всё. А передать-то имя файла как? А если нельзя узнать какой именно лог собирается перевернуть logrotate, то какой смысл в выполнении слепого скрипта при каждой отдельно взятой ротации?

Мне бы пригодилась возможность посмотреть timestamp каждого журнала, который подлежит ротации, но как сделать это с файлом, который logrotate нашёл самостоятельно, обрабатывая wildcard?

LexxTheFox

А передать-то имя файла как? А если нельзя узнать какой именно лог собирается перевернуть logrotate, то какой смысл в выполнении слепого скрипта при каждой отдельно взятой ротации?

смысл в том, что вы можете выполнять пре- и пост- скрипты для группы логов. Очень многие программы умеют писать несколько лог-файлов (apache, proftpd, и т.д.), вот для таких логов имеет смысл останавливать демон на время ротации. А то, что вы придумали - вы придумали наверное первым. Лично мне такое в голову не приходило. Очевидно, что авторам logrotate тоже. Ну просто не нужно передавать имя логов скрипту - он выполняется перед(после) ротацией всей группы, а не для каждого файла отдельно.

drBatty ★★
()
Ответ на: комментарий от drBatty

Ну просто не нужно передавать имя логов скрипту - он выполняется перед(после) ротацией всей группы, а не для каждого файла отдельно.

Я бы согласился на такое объяснение, но в приведённой мной выдержке из мана:

«sharedscripts: Normally, prerotate and postrotate scripts are run for each log which is rotated, meaning that a single script may be run multiple times for log file entries which match multiple files (such as the /var/log/news/* example).»

прямо акцент сделан на том, что

«Normally .. scripts are run for each log .. a single script may be run multiple times for log file entries which match multiple files (such as the /var/log/news/* example).»

т.е. такое поведение не только возможно, оно даже по умолчанию. Рекомендую ознакомиться с полным текстом: man logrotate. Не вижу смысла копировать его сюда весь.

Вот я и не врубаюсь что всё это значит: по умолчанию скрипт выполняется для каждого файла, который подошёл к маске и признан готовым к ротации. Но при этом имя файла получить нельзя. По крайней мере не сказано как. Тогда зачем?

LexxTheFox ★★
() автор топика
Ответ на: комментарий от LexxTheFox

LexxTheFox

т.е. такое поведение не только возможно, оно даже по умолчанию. Рекомендую ознакомиться с полным текстом: man logrotate. Не вижу смысла копировать его сюда весь.

мне лично лень. Я его полностью изучил несколько лет назад. Но такого не припоминаю.

LexxTheFox

Вот я и не врубаюсь что всё это значит: по умолчанию скрипт выполняется для каждого файла, который подошёл к маске и признан готовым к ротации. Но при этом имя файла получить нельзя. По крайней мере не сказано как. Тогда зачем?

без понятия. Может есть ещё инфа в info и/или на сайте разрабов? Особенно интересует Changelog, ибо тормозить N раз апач, что-бы ротировать N логов мне видится бредом.

drBatty ★★
()
Ответ на: комментарий от drBatty

Я его полностью изучил несколько лет назад. Но такого не припоминаю.

А оно есть.

мне лично лень

Спасибо, очень помог :-P

Может есть ещё инфа в info и/или на сайте разрабов?

Info идентично man. Ресурса собственного у этой утилиты нет. Этак придётся мейнтейнера пакета вопросами тремать. Или искать способа связаться с авторами оригинала из Red Hat.

LexxTheFox ★★
() автор топика
Ответ на: комментарий от LexxTheFox

LexxTheFox

А оно есть.

А мне Патрег такое дал:

The next section defines the parameters for both /var/log/httpd/access.log and /var/log/httpd/error.log. They are rotated whenever it grows over 100k in size, and the old logs files are mailed (uncompressed) to www@my.org after going through 5 rotations, rather than being removed. The shared- scripts means that the postrotate script will only be run once (after the old logs have been compressed), not once for each log which is rotated. Note that the double quotes around the first filename at the beginning of this section allows logrotate to rotate logs with spaces in the name. Nor- mal shell quoting rules apply, with ', ", and \ characters supported.

если я что-то понимаю, то у меня скрипт выполняется только ОДИН раз для всех файлов.

LexxTheFox

Спасибо, очень помог :-P

извини.

LexxTheFox

Info идентично man. Ресурса собственного у этой утилиты нет. Этак придётся мейнтейнера пакета вопросами тремать. Или искать способа связаться с авторами оригинала из Red Hat.

странно, ибо авторы как раз из RH

AUTHORS
Erik Troan <ewt@redhat.com>
Preston Brown <pbrown@redhat.com>

PS: поглядел в Debian - тоже самое.

drBatty ★★
()
Ответ на: комментарий от drBatty

Ох, Патрег дал тебе то же самое.

The shared- scripts means that the postrotate script will only be run once (after the old logs have been compressed), not once for each log which is rotated.

Наличие параметра shared- scripts означает, что скрипт postrotate будет выполнен лишь единожды (после того, как старые логи будут сжаты архиватором), а не каждый раз, когда обрабатывается отдельно взятый лог.

Соответственно, параметр nosharedscript делает ровно наоборот. И, кстати, это поведение по умолчанию. Чтобы postrotate выполнился один раз для всех, необходимо явно указать параметр sharedscript.

Вот полный текст моего мана.

А вот выдержки для ленивых:

       sharedscripts
              Normally, prerotate and postrotate scripts are run  for  each  log  which  is
              rotated,  meaning that a single script may be run multiple times for log file
              entries which match multiple files (such as the /var/log/news/* example).  If
              sharedscript  is specified, the scripts are only run once, no matter how many
              logs match the wildcarded pattern.  However, if none of the logs in the  pat‐
              tern  require  rotating,  the  scripts will not be run at all. If the scripts
              exit with error, the remaining actions will not be  executed  for  any  logs.
              This option overrides the nosharedscripts option and implies create option.

       nosharedscripts
              Run  prerotate  and  postrotate  scripts  for every log file which is rotated
              (this is the default, and overrides the sharedscripts option). If the scripts
              exit  with error, the remaining actions will not be executed for the affected

Выделю жирным (уже приводил этот кусок выше, но не поленюсь воткнуть сюда ещё раз): Normally, prerotate and postrotate scripts are run for each log which is rotated, meaning that a single script may be run multiple times for log file entries which match multiple files (such as the /var/log/news/* example).

странно, ибо авторы как раз из RH

По-моему я так и сказал.

LexxTheFox ★★
() автор топика
Ответ на: комментарий от LexxTheFox

да. Действительно. Однако дефолт - коварная штука, у меня есть logrotate.conf, в котором описана ротация обычных логов, но группы логов лежат отдельно, в logrotate.d/. Причём там например для http указано так:

/var/log/httpd/*_log {
  rotate 10
  notifempty
  missingok
  size=5M
  compress
  delaycompress
  sharedscripts
  postrotate
    /etc/rc.d/rc.httpd restart
  endscript
}
(тут я кое-что менял, но sharedscripts поставил Патрег)

ЗЫЖ не надо мне манов, у меня есть под рукой CentOS.

drBatty ★★
()
Ответ на: комментарий от drBatty

Извини, друг, но ты совершенно невыносим :) Я говорю про Фому, а ты мне вторишь про Ерёму.

В дистрибутиве делают override странному необъяснимому default'у, да. Так мой вопрос состоит в том, что я хочу понять для чего существует этот самый странный необъяснимый default. В том виде в каком есть, он на первый взгляд бесполезен. Вот его и переопределяют. Суть вопроса (похоже, риторического) - таки это просто бесполезный default, который не допилили до полезного состояния, или я просто не понял как его готовить?

Твою позицию запишем в ползу предположения, что он не допилен и бесполезен. Есть у кого-нибудь иное мнение?

LexxTheFox ★★
() автор топика
Ответ на: комментарий от LexxTheFox

LexxTheFox

Твою позицию запишем в ползу предположения, что он не допилен и бесполезен.

угу.

что-то похожее случилось с tar Multi-Volume Archives - там тоже скрипт не может получить имя тома. Потому надо тома делать исключительно ручками. Это в CentOS. В других системах тома создаются сами по себе.

drBatty ★★
()
Ответ на: комментарий от LexxTheFox

А, догнал смысл фразы. Ну кописпаста не повредит - вдруг ничего кроме браузера нет под рукой, подстраховаться не вредно.

LexxTheFox ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.