Вопрос: Почему мой crontab не работает, и как я могу его устранить?


Это Канонический вопрос об использовании cron & crontab.

Вы были направлены сюда, потому что сообщество достаточно уверенно, что ответ на ваш вопрос можно найти ниже. Если ваш вопрос не отвечает ниже, ответы помогут вам собрать информацию, которая поможет сообществу помочь вам. Эта информация должна быть отредактирована в ваш исходный вопрос.

Ответ для 'Почему мой crontab не работает, и как я могу его устранить?'можно увидеть ниже. Это касается cron система с подчеркнутым кронтабом.


186
2017-11-17 04:51


Источник


Это огромный обман Причины, по которым crontab не работает на AskUbuntu. - Dan Dascalescu


Ответы:


Как исправить все проблемы / проблемы, связанные с crontab (Linux)


Это Сообщество wiki, если вы заметили что-либо неправильное с этим ответом или получите дополнительную информацию, пожалуйста, отредактируйте его.


Во-первых, базовая терминология:

  • хрон (8) это демон, который выполняет запланированные команды.
  • кронтаб (1) это программа, используемая для изменения файлов пользователя crontab (5).
  • кронтаб (5) представляет собой файл пользователя, содержащий инструкции для cron (8).

Далее, образование о cron:

Каждый пользователь в системе может иметь свой собственный файл crontab. Расположение корневых и пользовательских файлов crontab зависит от системы, но они, как правило, ниже /var/spool/cron,

Существует общесистемный /etc/crontab файла, /etc/cron.d каталог может содержать фрагменты crontab, которые также читаются и действуют cron. Некоторые дистрибутивы Linux (например, Red Hat) также имеют /etc/cron.{hourly,daily,weekly,monthly} которые представляют собой каталоги, скрипты, внутри которых будут выполняться каждый час / день / неделя / месяц, с привилегиями root.

root всегда может использовать команду crontab; обычные пользователи могут получить или не получить доступ. Когда вы редактируете файл crontab с помощью команды crontab -e и сохранить его, crond проверяет его на базовую достоверность, но не гарантирует, что ваш файл crontab правильно сформирован. Существует файл, называемый cron.deny который укажет, какие пользователи не могут использовать cron. cron.deny расположение файла зависит от системы и может быть удалено, что позволит всем пользователям использовать cron.

Если компьютер не включен, или демон crond не запущен, и дата / время для запуска команды прошло, crond не будет проверять и запускать предыдущие запросы.

crontab detailss, как сформулировать команду:

Команда crontab представлена ​​одной строкой. Вы не можете использовать \ для расширения команды по нескольким строкам. Хэш (#) представляет собой комментарий, который означает, что все, что на этой линии, игнорируется cron. Ведущие пробелы и пустые строки игнорируются.

Будьте ОЧЕНЬ осторожны при использовании процентов (%) войдите в свою команду. Если они не сбежались \% они преобразуются в новые строки и все после первого неэкранированного % передается вашей команде на stdin.

Существует два формата файлов crontab:

  • Пользователь crontabs

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *   command to be executed
    
  • Широкая система /etc/crontab а также /etc/cron.d фрагменты

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    

Обратите внимание, что для последнего требуется имя пользователя. Команда будет запущена как именованный пользователь.

Первые 5 полей строки представляют время (ы), когда команда должна быть запущена. Вы можете использовать числа или подходящие имена дней / месяцев в спецификации времени.

  • Поля разделяются пробелами или вкладками.
  • Запятая (,) используется для указания списка, например, 1,4,6,8, что означает пробег в 1,4,6,8.
  • Диапазоны задаются тире (-) и могут быть объединены со списками, например. 1-3,9-12, что означает от 1 до 3, а затем между 9 и 12.
  • / символ может использоваться для введения шага, например. 2/5, что означает начало с 2, затем каждые 5 (2,7,12,17,22 ...). Они не завершают конца.
  • Звездочка (*) в поле означает весь диапазон для этого поля (например, 0-59 для минутного поля).
  • Диапазоны и этапы могут быть объединены, например. */2 означает начало с минимума для соответствующего поля, затем каждые 2, например. 0 за минуты (0,2 ... 58), 1 в течение месяцев (1,3 ... 11) и т. Д.

Отладка команд cron

Проверьте почту! По умолчанию cron отправит любой результат из команды пользователю, который выполняет команду as. Если нет выхода, почты не будет. Если вы хотите, чтобы cron отправил почту на другую учетную запись, вы можете установить переменную среды MAILTO в файле crontab, например.

MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command

Захватите результат самостоятельно

1 2 * * *  /path/to/your/command &>/tmp/mycommand.log

который фиксирует stdout и stderr в /tmp/mycommand.log

Посмотрите на журналы; cron регистрирует свои действия через syslog, которые (в зависимости от вашей настройки) часто переходят к /var/log/cron или /var/log/syslog,

При необходимости вы можете отфильтровать операторы cron, например.

grep CRON /var/log/syslog 

Теперь, когда мы рассмотрели основы cron, где находятся файлы и как их использовать, давайте рассмотрим некоторые общие проблемы.

Убедитесь, что cron запущен

Если cron не запущен, ваши команды не будут назначены ...

ps -ef | grep cron | grep -v grep

должно получить вам что-то вроде

root    1224   1  0 Nov16 ?    00:00:03 cron

или

root    2018   1  0 Nov14 ?    00:00:06 crond

Если не перезапустить его

/sbin/service cron start

или

/sbin/service crond start

Могут быть и другие методы; используйте то, что предоставляет ваш дистрибутив.

cron запускает вашу команду в ограниченной среде.

Какие переменные среды доступны, вероятно, будут очень ограниченными. Как правило, вы получаете только определенные переменные, например $LOGNAME, $HOME, а также $PATH,

Особо следует отметить PATH ограничивается /bin:/usr/bin, Подавляющее большинство «моего cron-скрипта не работает», проблемы вызваны этим ограничительным путем, Если ваша команда находится в другом месте, вы можете решить это несколькими способами:

  1. Предоставьте полный путь к вашей команде.

    1 2 * * * /path/to/your/command
    
  2. Предоставьте подходящую PATH в файле crontab

    PATH=/usr:/usr/bin:/path/to/something/else
    1 2 * * * command 
    

Если вашей команде нужны другие переменные среды, вы также можете определить их в файле crontab.

cron запускает вашу команду с помощью cwd == $ HOME

Независимо от того, где выполняемая вами программа находится в файловой системе, текущий рабочий каталог программы, когда cron запускает ее, будет домашний каталог пользователя, Если вы обращаетесь к файлам в своей программе, вам нужно принять это во внимание, если вы используете относительные пути, или (желательно) просто используйте полностью квалифицированные маршруты повсюду, и сэкономите всех в путанице.

Последняя команда в моем crontab не запускается

Cron обычно требует, чтобы команды заканчивались новой строкой. Отредактируйте свой crontab; перейдите к концу строки, содержащей последнюю команду, и вставьте новую строку (нажмите enter).

Проверьте формат crontab

Вы не можете использовать crontab crontab ctrlab для / etc / crontab или фрагменты в /etc/cron.d и наоборот. Пользователь crontab, отформатированный пользователем, не включает имя пользователя в 6-ое положение строки, а система, отформатированная crontab, включает имя пользователя и запускает команду в качестве этого пользователя.

Я помещаю файл в /etc/cron.{hourly,daily ,weekly,monthly}, и он не запускается

  • Убедитесь, что имя файла не имеет расширения. Заурядный части
  • Убедитесь, что у файла есть разрешения на выполнение.
  • Сообщите системе, что использовать при выполнении вашего скрипта (например, put #!/bin/sh наверху)

Связанные с Cron ошибки

Если ваша дата недавно была изменена пользователем или системным обновлением, часовым поясом или другим, тогда crontab начнет вести себя беспорядочно и проявит причудливые ошибки, иногда работает, а иногда и нет. Это попытка crontab попытаться «сделать то, что вы хотите», когда время изменится из-под нее. Поле «минута» станет недействительным после изменения часа. В этом случае будут приняты только звездочки. Перезагрузите cron и попробуйте снова, не подключаясь к Интернету (так что дата не имеет возможности перезагрузить один из серверов времени).

Процентные знаки, снова

Чтобы подчеркнуть совет о знаках процента, вот пример того, что делает cron с ними:

# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz

создаст файл ~ / cron.out, содержащий 3 строки

foo
bar
baz

Это особенно навязчиво при использовании date команда. Обязательно избегайте указателей процента

* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"

267
2017-10-09 15:29



Может также упоминаться в разделе «ограниченный env», что LD_LIBRARY_PATH также может потребоваться установить любые дополнительные каталоги в случае сбоя вашей задачи cron из-за невозможности найти разделяемые библиотеки. - DavidJ
обратите внимание, что вы даже можете написать что-то вроде этого: 35 1,5-23 / 2 * * * do_something вместо 35,1,5,7,9, .. * * * Дополнительно это crontab.guru переводит записи, которые вы делаете на человеческий язык. - Dennis Nolte
Выходной снимок не работает для меня, возможно, из-за оболочки sh. Я думаю, что это более портативно: ... /path/to/your/command >/tmp/mycommand.log 2>&1 - chus
это сработало для меня: sudo apt-get install postfix - jmunsch
задание cron также зависит от того, насколько тяжелым является файл? Поскольку я запускал простой мир привет в python с cron, он работал. Но мой второй код был немного тяжелым и обычно выполнялся, но с cron он не выдавал никакого результата в файл. - Devendra Bhat


Если ваши cronjobs перестают работать, убедитесь, что ваш пароль не истек., Так как после этого все задания cron останавливаются.
Будут сообщения в /var/log/messages аналогично приведенному ниже, в котором показаны проблемы с аутентификацией пользователя:

(username) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)


18
2018-02-04 20:29



Просто получил это также (файл сообщения об ошибке / var / log / syslog для меня). В моем случае ящик DigitalOcean, который при создании времени перезагружает пароль root (необязательно) на другой, и, видимо, пока вы не войдете туда и не измените его, все задания cron не будут выполняться. Облом. Исправить что-то вроде sudo -u root passwd - rogerdpack


Debian Linux и его производные (Ubuntu, Mint и т. Д.) Имеют некоторые особенности, которые могут помешать выполнению ваших заданий cron; в частности, файлы в /etc/cron.d, /etc/cron.{hourly,daily,weekly,monthly} должен :

  • быть владельцем root
  • записывать только root
  • не могут быть записаны группой или другими пользователями
  • иметь имя без каких-либо точек ». или любой другой специальный символ, но «-» и «_».

Последний болит регулярно ничего не подозревающих пользователей; в частности, любой скрипт в одной из этих папок, названный whatever.sh, mycron.py, testfile.pl, и т.д. не исполняться, когда-либо.

По моему опыту, этот конкретный момент был, безусловно, наиболее частым поводом для неисполнения cronjob для Debian и производных.

Видеть man cron для получения более подробной информации, если необходимо.


14
2017-11-17 14:37





Необычные и нерегулярные графики

Cron - это все, что считается очень простым планировщиком, и синтаксис не позволяет администратору сформулировать несколько более необычные графики.

Рассмотрим следующую работу, которая обычно объясняется "бег command каждые 5 минут ":

*/5 * * * * /path/to/your/command

против:

*/7 * * * * /path/to/your/command

который не всегда бег command каждые 7 минут,

Помните, что / символ может использоваться для введения шага, но эти шаги не завершаются за пределами серии, например. */7 который соответствует каждой седьмой минуте из протокола 0-59  то есть 0,7,14,21,28,35,42,49,56, но от одного часа до следующего будут всего 4 минуты между партиями, после 00:56 новая серия начинается с 01:00, 01:07 и т. д. (и партии не будут работать 01:03 , 01:10 , 01:17 и т.д.).


Что делать вместо этого?

Создание нескольких партий

Вместо одного задания cron создайте несколько партий, которые в совокупности приведут к желаемому расписанию.

Например, для запуска партии каждые 40 минут (00:00, 00:40, 01:20, 02:00 и т. Д.) Создайте две партии: одну, которая выполняется дважды в четные часы, а вторая - только нечетные часы:

# The following lines create a batch that runs every 40 minutes i.e.

# runs on   0:00, 0:40,        02:00, 02:40         04:00 etc to 22:40
0,40 */2 * * * /path/to/your/command

# runs on               01:20,               03:20,       etc to 23:20
20 1/2 * * * /path/to/your/command

# Combined: 0:00, 0:40, 01:20, 02:00, 02:40, 03:20, 04:00 etc.

Запускайте свои партии реже 

Вместо того, чтобы запускать свою партию каждые 7 минут, что является сложным графиком для разбивки несколькими партиями, просто запустите его каждые 10 минут.

Запускайте свои партии чаще 

Многие нечетные расписания развиваются из-за того, что периодическое время цикла увеличивается / колеблется, а затем партии планируются с небольшим количеством дополнительного запаса прочности, чтобы предотвратить одновременное совпадение и запуск последующих запусков одной партии.

Вместо этого подумайте по-другому и создайте cronjob, который будет неудачно изящно, когда предыдущий запуск еще не закончен, но который будет работать иначе. Видеть это Вопрос &:

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job --minutely

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

В bash seven-minute-job будет выглядеть примерно так:

#!/bin/bash
# seven-minute-job
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated

if [ ! -f /tmp/lastrun ] ; then
    touch /tmp/lastrun
fi

if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
    echo "The minimum interval of 7 minutes between successive batches hasn't passed yet."
    exit
fi

echo "Start running your batch"

date > /tmp/lastrun

Затем вы можете безопасно (пытаться) запускать каждую минуту:

* * * * * /path/to/your/seven-minute-job

Не использовать cron

Если ваши потребности сложны, вы можете использовать более продвинутый продукт, предназначенный для запуска сложных расписаний (распределенных по нескольким серверам) и поддерживающий триггеры, зависимость от работы, обработку ошибок, мониторинг попыток и т. Д. Промышленный жаргон будет «корпоративным», планирование работы и / или «автоматизация рабочей нагрузки».


10
2017-10-23 04:45





PHP конкретные

Если у вас есть работа cron, например:

php /bla/bla/something.php >> /var/logs/somelog-for-stdout.log

И в случае ошибок ожидать, что они будут отправлены вам, но они не - проверьте это.

PHP по умолчанию не отправляет ошибки в STDOUT. @видеть https://bugs.php.net/bug.php?id=22839

Чтобы исправить это, добавьте cli`s php.ini или в свою строку (или в вашу оболочку bash для PHP):

  • --define display_startup_errors = 1
  • --define display_errors = 'stderr'

1-я настройка позволит вам иметь такие смертельные, как «Memory oops» и 2nd - перенаправить их все на STDERR. Только после того, как вы сможете хорошо спать, так как все будет отправлено на почту вашего корня вместо того, чтобы просто войти в систему.


8



Этот отчет об ошибке был закрыт в 2007 году, когда статус патча добавлен в ветви PHP 5.2+. Вы уверены, что это необходимо? Я просто пробовал PHP 5.4 и, похоже, работает нормально. (Это все еще необходимо для PHP 4). - Xeoncross
@Xeoncross см. Дату ответа :) - gaRex
Да, это меня смутило с тех пор, как вы ответили в 2013 году, и билет вернулся в «07». - Xeoncross