Недавно была проблема. После переноса сайта, который крутился на сервере с FreeBSD, на сервер под Ubuntu. И задания в cron были перенесены тоже полностью. Скрипты, которые должен был исполнять cron отвечали за рассылку почты подписчикам. И чтобы не повалить ничего отправлялись партиями по несколько штук раз в минуту. Но они не работали. Я, признаться, не спец по Linux и в причинах разбирался долго. Вот так выглядело задание в кроне:
*/1 * * * * root ~/сам_скрипт/
На первый взгляд все довольно логично. Выполнять раз в минуту от пользователя root такой-то скрипт. Неразбериха была в том, что запущенный не из крона, скрипт срабатывал и рассылал сообщения. Сами задания на сервере с фрибздёй работают нормально. Моему неопытному взгляду предстала картина из которой я поспешил сделать неверный вывод о неработающем кроне и начал искать пути решения. Дебаг в виде заведомо рабочих команд, типа:
*/1 * * * * root touch ~/test.sh/
ни к чему не приводил. Потратил я времени довольно много на поиски проблемы. Когда по всем запросам в гугле выдача состояла из посещенных ссылок я начал стучаться в аськи к знакомым с проблемой. На первый взгляд строка выглядит правильно и логично, что подтверждали и все знакомые. Но спасибо Артуру! Он пригляделся и посоветовал протестить без указания, от чьего имени запускать скрипт. То есть задача в кроне стала выглядеть вот так:
*/1 * * * * ~/сам_скрипт/
Признаться, положительного результата я не ждал и уже, в общем, отчаялся. Какова была моя радость, когда создался тестовый файлик (тестил я еще с функцией touch). Оказалось, что виной всему было отсутствие опыта и невнимательность к мелочам. Да, на фрибсд команда срабатывала корректно. Да, сама по себе она выглядела нормально. Да, встречалось подобное и на форумах. Но незнание таких мелочей, что для Ubuntu не нужно указывать имя пользователя, от кого исполнять команду отняло немало времени!
Собственно, мораль сей басни следующая:»Если что-то не работает, даже если кажется, что должно работать, думай о мелочах и отличиях места, где не работает, от места, где работало. Особенно, если приходится копировать, а не писать свое!»
У меня сейчас такая же ерунда, скрипт твиттера не работает из крона, но прекрасно пашет из адресной строки. различия в том, что переменная $_SERVER['DOCUMENT_ROOT'] в нем выдает разные пути, если читать ее кроном и вызывать из адресной строки браузера. Может, кому пригодится