Сисадмин-любитель (ulrith) wrote,
Сисадмин-любитель
ulrith

cron and anacron does not work on ubuntu server

Прошло уже полгода, как я съехал из России. В смысле, сайты свои, после очень типичной для РФ истории, произошедшей с моим прошлым хостером Макхостом, перенёс в Евросоюз, а точнее в Латвию. За полгода нареканий на провайдера нет, так что оглашаю урл: nano.lv. По моей просьбе на сервер поставили Ubuntu 8.04 LTS, который (Ubuntu) стоит у меня и дома, и на работе.

Так вот, не прошло и полгода, как я заметил, что на сервере не ротируются некоторые логи, а именно: syslog, mail.info, mail.warn… Они за полгода распухли уже до 300-600 Мб. Проведя расследование, я обнаружил, что ротация этих логов происходит не через утилиту logrotate, которую я худо-бедно освоил за последнее время, а посредством скрипта sysklogd, который лежит в /etc/cron.daily.

Т.е. не работает именно крон. Стыдно сказать, но до последнего времени я очень плохо знал организацию работы cron в Ubuntu, ограничиваясь планированием нескольких повторяющихся задач при помощи crontab под рутом. Работает и работает — чего его изучать-то? А тут вот пришлось разбираться как там всё устроено.

А устроено оно следующим образом: есть сервис cron, который раз в минуту просматривает запланированные задачи и запускает то, что должно быть запущено. При этом кроме того, что каждый пользователь может создать собственный список задач при помощи crontab, имеется системный крон, и он-то нам, в случае сервера, очевидно, и нужен.

Системный файл crontab лежит в /etc и, в отличие от пользовательских кронтабов из /var/spool/cron/crontabs, может редактироваться напрямую. При этом в нём заданы и команды, выполняющие еже-часные/дневные/недельные/месячные скрипты из папок /etc/cron.{hourly,daily,weekly,monthly}, в том числе и наш неработающий скрипт. Вот эти команды:

# m h dom mon dow user    command
41 * * * * root cd / && run-parts --report /etc/cron.hourly
46 1 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
51 3 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
45 4 2 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )


Как мы видим, только ежечасные задачи запускаются непосредственно, а все более редкие — только в случае, если скрипт не находит исполняемый файл anacron в папке /usr/sbin. Но что же это за anacron такой? Оказывается, это асинхронный cron — замена cron для машин, которые работают не постоянно — типа домашних компьютеров или ноутбуков.

Так вот, как говорит Google, этот самый анакрон, который, в случае его наличия в системе, призван выполнять работу крона, на Ubuntu server работает хреново:
http://serverfault.com/questions/99521/why-would-anacron-not-be-running
https://wiki.ubuntu.com/OnnoBenschop/ubuntu-server/cron-bug
https://bugs.launchpad.net/ubuntu/+source/anacron/+bug/382315

А учитывая, что в случае веб-сервера его выключение — это не ежедневная рутина, а скорее катастрофа, лучшим решением мне показалось просто удалить пакет anacron из системы — чтобы он не мешал cron-у выполнять свои функции. А все задачи из рутового crontab-а я для порядка перенёс в папки /etc/cron.* и общесистемный /etc/crontab.Теперь всё работает.
Tags: hosting, unixway
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment