··# Если самый свежий архив журнала (back1) изменялся не позднее
··#·· заданного промежутка, значит, время ротации еще не подошло. Это
··#·· можно определить командой find с флагом −mtime.
··if [-f "$back1"]; then
····if [-z "$(find \"$back1\" −mtime +$duration −print 2>/dev/null)"]
····then
······/bin/echo −n "$name's most recent backup is more recent than $duration "
······echo "days: skipping"; continue
····fi
··fi
··echo "Rotating log $name (using a $duration day schedule)"
··# Ротация начинается с самого старого архива, но будьте осторожны,
··#·· так как некоторые файлы могут просто отсутствовать.
··if [-f "$back3"]; then
····echo"… $back3 — > $back4"; $mv −f "$back3" "$back4"
··fi
··if [-f "$back2"]; then
····echo"… $back2 — > $back3"; $mv −f "$back2" "$back3"
··fi
··if [-f "$back1"]; then
····echo"… $back1 — > $back2"; $mv −f "$back1" "$back2"
··fi
··if [-f "$name"]; then
····echo"… $name — > $back1"; $mv −f "$name" "$back1"
··fi
··touch "$name"
··chmod 0600 "$name" # Последний шаг: изменить права файла на rw-························для безопасности
done
if [$count −eq 0]; then
··echo "Nothing to do: no log files big enough or old enough to rotate"
fi
exit 0
Для максимальной пользы сценарий работает с конфигурационным файлом, который находится в каталоге /var/log , позволяя администратору определять разные периоды ротации для разных файлов журналов. В листинге 6.13 показано содержимое типичного конфигурационного файла.
Листинг 6.13.Пример конфигурационного файла для сценария rotatelogs
# Конфигурационный файл для сценария ротации файлов журналов:···· Формат name=duration,
#·· где name может быть именем любого файла в каталоге /var/log, а duration
#·· измеряется в днях.
ftp.log=30
lastlog=14
lookupd.log=7
lpr.log=30
mail.log=7
netinfo.log=7
secure.log=7
statistics=7
system.log=14
# Файлы с периодом ротации, равным нулю, игнорируются.
wtmp=0
Основу и, пожалуй, самую замысловатую часть сценария составляет команда find
. Она возвращает все файлы в каталоге /var/log с размером больше нуля, имена которых не содержат цифр, не начинаются с точки (OS X, например, создает в этом каталоге массу файлов журналов с бессмысленными именами, и их все следует пропустить) и не заканчиваются расширением conf (вполне очевидно, что не имеет смысла выполнять ротацию нашего конфигурационного файла rotatelogs.conf ). Параметр maxdepth 1 гарантирует, что find не будет выполнять поиск в подкаталогах, а команда sed в самом конце удалит все ведущие последовательности./ из найденных совпадений.
ПРИМЕЧАНИЕ
Лень — двигатель прогресса! Сценарий rotatelogs демонстрирует фундаментальную идею программирования сценариев на языке командной оболочки: избегайте двойной работы. Вместо создания отдельных сценариев для ротации каждого файла журнала мы написали единый сценарий, централизованно решающий задачу ротации, что упрощает внесение модификаций.
Этот сценарий не принимает аргументов, но сообщает, какие журналы были подвергнуты ротации и почему. Кроме того, его следует запускать с привилегиями root.
Пользоваться сценарием rotatelogs просто, как демонстрирует листинг 6.14, но имейте в виду, что в зависимости от прав доступа к файлам может потребоваться запускать его с привилегиями root.
Листинг 6.14.Запуск сценария rotatelogs с привилегиями root для ротации журналов в /var/log
$ sudo rotatelogs
ftp.log’s most recent backup is more recent than 30 days: skipping
Rotating log lastlog (using a 14 day schedule)
… lastlog — > lastlog.1
lpr.log’s most recent backup is more recent than 30 days: skipping
Обратите внимание, что в данном примере критериям поиска соответствуют только три файла журналов. Из них только для lastlog не было создано достаточно свежей копии, согласно настройкам периода ротации в конфигурационном файле. Повторный запуск сценария rotatelogs, однако, не дал ничего, как показано в листинге 6.15.
Листинг 6.15.Повторный запуск rotatelogs показал отсутствие журналов, требующих ротации
$ sudo rotatelogs
ftp.log’s most recent backup is more recent than 30 days: skipping
lastlog’s most recent backup is more recent than 14 days: skipping
lpr.log’s most recent backup is more recent than 30 days: skipping
Усовершенствование сценария
Одно из усовершенствований, которое можно добавить в сценарий, чтобы сделать его еще более полезным, — реализовать отправку самого старого архива, файла $back4, по электронной почте или копирование в облачное хранилище перед уничтожением командой mv. Проще всего отправку по электронной почте вставить в сценарий перед командой:
Читать дальше