Что делать если задание CRON не выполняется
CRON — служба, которая по установленному расписанию выполняет задание. При этом процесс не отслеживается и если в задании допущен ошибка и ошибки содержит скрипт, добавленный в CRON, ожидаемого результата не будет.
Задание в общем случае выглядит так:
5 4 * * * cd /home/site/ && /usr/bin/php somescript.php
Если в результате выполнения скрипта, должны обновляться какие-то данные и обновление не происходит следует прежде всего попробовать запускать задание из консоли. В примере задание не выполняется потому, что файл из задания отсутствует в нужном каталоге.
Т.е. авторизоваться на сервере по SSH с реквизитами пользователя для которого прописан CRON и затем выполнить
Если скрипт содержит ошибки — они будут выведены в консоль, когда ошибок нет — поможет разработчик скрипта и CRON не при чем.
При отсутствии ошибок в скрипте и успешном его выполнении из консоли следует отслеживать сами срабатывания. Самый простой способ — анализ логов.
Демон CRON записывает информацию о каждом срабатывании в /var/log/syslog.
Также можно скорректировать задание таким образом, чтобы запись в лог была частью задания — например, добавив конструкцию && echo `date` >> /var/log/cronlog
Задание примет такой вид
5 4 * * * cd /home/site/ && /usr/bin/php somescript.php && echo `date` >> /var/log/cronlog
Каждый раз при успешном выполнении скрипта в файл /var/log/cronlog будет дописываться время выполнения. Если время дописывается — задание выполняется успешно.
Источник
как узнать почему не выполняется скрипт в cron
Добрый день. Добавил в крон скрипт для архивации некоторых папок с ограниченным доступом. Если указываю root пользователем для запуска — все работает. Указываю другого, который так же имеет доступ к папкам — не работает. В логе крона указано, что задание было запущено. В /var/log/messages ничего нет. Как узнать, почему задание не отрабатывает?
Сообщение об ошибках уходят юзеру (в локальную почту), от крона которого запускают скрипт. Можешь глянуть в что-то типа /var/spool/mail или просто запустить mutt (от нужного юзера).
Но быть может скрипт просто подвисает в ожидании чего-то (как вариант)? В процессах его нигде не видно?
В почте смотрел — ничего нет. В процессах скрипт тоже не висит.
Ну тогда нужно смотреть в скрипт. Или сами отладку проведите, или сюда высыпайте — думаю общий разум осилит.
ошибка в абсолютном/относительном пути к файлу запуска
А вы из под этого юзера пытались скрипт запускать?
как узнать почему не выполняется скрипт в cron
Использовать логирование и отладку.
Если при запуске через шелл работает, а через крон нет, то может быть связано с переменной окружения $PATH. А вообще, да, логгирование в помощь.
Капитан очевидность вангует на кофейной гуще: у рута стоит /bin/bash интерпретатором, а у юзера — /bin/sh, а скрипт использует фичи баша и фейлится при их отсутствии в sh.
Если указываю root пользователем для запуска — все работает. Указываю другого, который так же имеет доступ к папкам — не работает.
Во первых входит ли пользователь в группу sudo? Во вторых есть ли файл /etc/cron.allow и прописан ли там пользователь?
Как узнать, почему задание не отрабатывает?
Попробуйте дописать перенаправление вывода в ваш лог файл
Спасибо. Ваш совет помог разобраться. Дело было в правах доступа к папкам со скриптом. Кстати, есть ли какие-то рекомендуемые места в системе для хранения скриптов, доступные всем юзерам?
Кстати, есть ли какие-то рекомендуемые места в системе для хранения скриптов, доступные всем юзерам?
Источник
Подскажите, почему не отрабатывает скрипт в crontab
Добрый день. Есть один скрипт recycle_clean.sh, он запускается вручную успешно и отрабатывает, но вот в /etc/crontab есть такая запись:
И из него почему-то не отрабатывает этот скрипт. Cron вроде запущен, по /etc/init.d/cron status выдает:
Стало быть крон запущен. Подскажите, почему не отрабатывает?
ls -l /root/scripts/recycle_clean.sh
head /root/scripts/recycle_clean.sh
Выложи содержимое скрипта и syslog в момент запуска кроном.
Вангую отсутствие PATH
и пустую строку в конце не забудьте.
Это группа, в ней доменные пользователи. А так, как вы предложили (* * * * *), он же не будет отрабатывать раз в сутки, или будет?
У меня нет такого лога даже: /var/log/crond.log
и пустую строку в конце не забудьте
старообрядцы в треде
Это группа, в ней доменные пользователи. А так, как вы предложили (* * * * *), он же не будет отрабатывать раз в сутки, или будет?
он будет отрабатывать 1440 раз в сутки. Каждую минуту. Ускоряет поиск ошибки в 1440 раз.
Да, таких групп не бывает в Linux’е.
У меня нет такого лога даже: /var/log/crond.log
а что, починили, да? Я не в курсе, vim подставляет самостоятельно. Но может ТС notepad.exe юзает?
Честно говоря, вообще никогда не встречал этой проблемы в реальности, и всегда думал что crontab -e сам всё валидирует и делает, хоть добавляй, хоть не добавляй
Я по мотивам какого-то треда пару лет назад тестировал это и всё работало при любом варианте
А чтобы раз в сутки нужно оставить как было:
Так как там достаточно много данных перемещает скрипт, каждую минуту не успеет.
Честно говоря, вообще никогда не встречал этой проблемы в реальности, и всегда думал что crontab -e сам всё валидирует и делает, хоть добавляй, хоть не добавляй
crontab -e вызывает EDITOR, а уж что делает $EDITOR — я не знаю. У меня это vim. А вот народ ставил mcedit, и жаловался на эту проблему.
Я по мотивам какого-то треда пару лет назад тестировал это и всё работало при любом варианте
строка должна заканчиваться \n, иначе это формально не строка, а мусор. Gcc предупреждает, но компиллит. А вот как сейчас crond — я не знаю.
А чтобы раз в сутки нужно оставить как было:
там можно и это, и любое другое валидное время поставить. Сначала минуты, а потом часы. Лучше ставить на пару минут вперёд, что-бы ждать две минуты.
То есть он не отрабатывает потому что не добавлен в
а после создания такого файла и добавления в него строки, аналогичной таковой в /etc/crontab будет автоматически отрабатывать?
То есть он не отрабатывает потому что не добавлен
не. Ты даже НЕ ЗНАЕШЬ, отрабатывается он, или нет. И если нет — то почему. А в том файле это будет написано.
/var/log/crond.log а после создания такого файла
он сам создастся, с ошибками, которые нужно исправить.
и в /var/log/crond.log появилось:
bash: 59: команда не найдена
задумайся, почему именно 59?
echo нужно в начале?
эту строчку в crontab надо вставлять. В консоль вставляй БЕЗ 59 23 * * * root
Да, это была такая папка, после выполнения скрипта вручную. Я ее удалил и все запустил заново, в логе пусто после этого.
Но все равно он не отрабатывал, так как папка должна создаваться каждый день, а они не создавались. Вот только сегодня вручную запустил — тогда создались.
PATH проверил, все вроде ок в ней.
Спасибо! Она мне не помешает! =) Показал другому одмину — говорит что сам крон не работает, а crontab в порядке. Но вроде показывает:
mv: невозможно переместить «/var/share/data_drive/Disk_S/.recycled/current» в «/var/share/data_drive/Disk_S/.recycled/2014-03-05/current»: Кат$
видимо «каталог существует»
mkdir: невозможно создать каталог «/var/share/data_drive/Disk_S/.recycled/current»: Файл существует
надо проверить, потом создавать
[ -d /var/share/data_drive/Disk_S/.recycled/current ] || mkdir /var/share/data_drive/Disk_S/.recycled/current
у вас в самом скрипте ошибки.
Пусть уволится, он не админ.
Да, это после того как я вручную запустил его (скрипт), каталог создался, и при последующем запуске тоже вручную выдалась такая ошибка, так как каталог был. Я его удалил. Но кронтаб все равно не работает, не понимаю почему.
У нас просто все неспешно. =)
Сейчас содержимое /etc/crontab такое:
Но кронтаб все равно не работает, не понимаю почему.
1. исправьте ошибки в скрипте. Вот что вы мне моск полоскаете? У меня сын первоклашка, у него есть работа над ошибками. У вас какая-то альтернативная школа?
2. заведомо рабочий скрипт пропишите в crontab. Потом читайте логи.
Checking periodic command scheduler. done (running).
и что? Да, работает чего-то. У меня куча таких шедулеров. Тоже работают. Что дальше?
Да вот даже простой скрипт
* * * * * root echo ‘Время: ‘ ; date
КУДА он должен его «выполнять»? Откуда он знает, что вы эмулятор терминала где-то внутри Xorg’а запустили?
Команда выполняется, а результата ты тупо НЕ ВИДИШЬ.
SHELL=/bin/bash же указан
блжад. Это то, ЧТО выполняет. А КУДА?
Обычно по дефолту оно в почту срёт. А у тебя MAILTO=. Что значит — в никуда.
Первый раз вижу, чтобы человек «почти осилил crontab», но в тоже время демонстрировал полное непонимание основ.
А
Вот попробовал на машине с точно таким же шестым дебианом —
И файл создался. А на моем злосчастном серваке — тишина при точно такой же строке.
Я не очень линуксоид по всяким серверным штукам, только как пользователь — ставлю убунты и переустанавливаю убунты.
А emulek’у я очень благодарен.
Первый раз вижу, чтобы человек «почти осилил crontab», но в тоже время демонстрировал полное непонимание основ.
Увы. С тех пор, как изобрели гугл, это обычная ситуация.
А на моем злосчастном серваке — тишина при точно такой же строке.
дык сделай логгирование, как я выше писал. Должно работать.
Да, куда ты прописываешь-то? И как?
Я просто в /etc/crontab прописал ниже под всем, ну команду touch на другой машине с аналогичным дебианом. А вот на этом серваке — тоже добавил. И не отрабатывает. Крон вроде везде одинаковый. Может его переставить? Просто не хотелось бы перезапускать этот сервак. Но просто перезапуск крона не помогает.
думаешь мне интересно, через какую жопу ты делаешь? Нет.
Просто скрипт же отрабатывает если вручную его запускать. Значит не в нем проблема.
Во-первых, если скрипт при повторном запуске без изменения входных данных может обломаться, то это плохой скрипт: http://ru.wikipedia.org/wiki/Идемпотентность
Во-вторых, настройте почтовую подсистему (достаточно взять какой-нибудь nullmailer, чтобы слал через smtp) и настройте перенаправление почты root-а к себе на ящик (ну, или локально складывать, если на машине нет интернета/доступа к какому-нибудь smtp-серверу). Это будет полезно не только для отладки cron, но и для получения информации по многим системным событиям (smartd руту пишет, например, когда на дисках происходит что-то нехорошее).
В-третьих, чтобы закончить бессмысленные аргументы на тему того, что «cron не работает», посмотрите /var/log/syslog. Там будут строчки типа:
Найдите строчки, которые соответствуют запуску задания с вашим скриптом (они там будут, даже если скрипт обломается).
Источник