Прошло уже полгода, как я съехал из России. В смысле, сайты свои, после очень типичной для РФ
истории, произошедшей с моим прошлым хостером Макхостом, перенёс в Евросоюз, а точнее в Латвию. За полгода нареканий на провайдера нет, так что оглашаю урл: 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-runninghttps://wiki.ubuntu.com/OnnoBenschop/ubuntu-server/cron-bughttps://bugs.launchpad.net/ubuntu/+source/anacron/+bug/382315 А учитывая, что в случае веб-сервера его выключение - это не ежедневная рутина, а скорее катастрофа, лучшим решением мне показалось просто удалить пакет anacron из системы - чтобы он не мешал cron-у выполнять свои функции. А все задачи из рутового crontab-а я для порядка перенёс в папки /etc/cron.* и общесистемный /etc/crontab.Теперь всё работает.