Это канонический вопрос об использовании cron & crontab.
Вас направили сюда, потому что сообщество достаточно уверено, что ответ на ваш вопрос можно найти ниже. Если на ваш вопрос нет ответа ниже, ответы помогут вам собрать информацию, которая поможет сообществу помочь вам. Эта информация должна быть отредактирована в исходном вопросе.
Ответ: « Почему мой crontab не работает, и как я могу устранить его? 'можно увидеть ниже. Это относится к cron
системе с выделенным crontab.
Ответы:
Как исправить все ваши проблемы / проблемы, связанные с crontab (Linux)
Во-первых, основная терминология:
Далее образование о 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, как сформулировать команду:
Команда crontab представлена одной строкой. Вы не можете использовать
\
для расширения команды на несколько строк. Знак hash (#
) представляет комментарий, который означает, что все в этой строке игнорируется cron. Ведущие пробелы и пустые строки игнорируются.Будьте ОЧЕНЬ осторожны при использовании
%
знака процента ( ) в вашей команде. Если они не экранированы,\%
они преобразуются в символы новой строки, и все, что после первого неэкранированного%
, передается вашей команде на стандартный ввод.Существует два формата файлов crontab:
Пользователь crontabs
Система в целом
/etc/crontab
и/etc/cron.d
фрагментыОбратите внимание, что последний требует имени пользователя. Команда будет запущена от имени указанного пользователя.
Первые 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 отправляет любые выходные данные команды пользователю, для которого она выполняет команду. Если нет вывода, не будет почты. Если вы хотите, чтобы cron отправлял почту на другую учетную запись, вы можете установить переменную среды MAILTO в файле crontab, например
Захватите результат самостоятельно
Вы можете перенаправить stdout и stderr в файл. Точный синтаксис для захвата вывода может варьироваться в зависимости от того, что использует оболочка cron. Вот два примера, которые сохраняют весь вывод в файл по адресу
/tmp/mycommand.log
:Посмотри логи
Cron регистрирует свои действия через системный журнал, который (в зависимости от вашей настройки) часто идет в
/var/log/cron
или/var/log/syslog
.При необходимости вы можете отфильтровать операторы cron, например:
Теперь, когда мы рассмотрели основы cron, где находятся файлы и как их использовать, давайте рассмотрим некоторые распространенные проблемы.
Проверьте, что cron работает
Если cron не запущен, ваши команды не будут запланированы ...
должен получить что-то вроде
или же
Если нет, перезапустите его
или же
Там могут быть другие методы; используйте то, что обеспечивает ваш дистрибутив.
cron запускает вашу команду в ограниченной среде.
Какие переменные среды доступны, вероятно, будет очень ограниченным. Как правило, вы получите только несколько переменных , определенных, например
$LOGNAME
,$HOME
и$PATH
.Особого внимания заслуживает
PATH
только/bin:/usr/bin
. Подавляющее большинство проблем «мой cron скрипт не работает» вызван этим ограничительным путем . Если ваша команда находится в другом месте, вы можете решить эту проблему несколькими способами:Укажите полный путь к вашей команде.
Укажите подходящий путь в файле crontab
Если вашей команде требуются другие переменные окружения, вы также можете определить их в файле crontab.
cron запускает вашу команду с помощью cwd == $ HOME
Независимо от того, где исполняемая программа находится в файловой системе, текущий рабочий каталог программы при запуске cron будет домашним каталогом пользователя . Если вы обращаетесь к файлам в своей программе, вам необходимо принять это во внимание, если вы используете относительные пути или (предпочтительно) просто везде используете полные пути и избавите всех от путаницы.
Последняя команда в моем crontab не запускается
Cron обычно требует, чтобы команды заканчивались новой строкой. Отредактируйте свой crontab; перейдите в конец строки, содержащей последнюю команду, и вставьте новую строку (нажмите ввод).
Проверьте формат crontab
Вы не можете использовать пользовательский crontab в формате / crontab для / etc / crontab или фрагменты в /etc/cron.d и наоборот. Crontab, отформатированный пользователем, не содержит имя пользователя в 6-й позиции строки, в то время как crontab, отформатированный системой, включает имя пользователя и запускает команду от имени этого пользователя.
Я помещаю файл в /etc/cron. enjhourly,daily,weekly,monthly}, и он не запускается
#!/bin/sh
сверху)Cron даты, связанные с ошибками
Если ваша дата была недавно изменена в результате обновления пользователя или системы, часового пояса или другого, то crontab начнет работать неправильно и выдает странные ошибки, иногда работающие, иногда нет. Это попытка crontab попытаться «сделать то, что вы хотите», когда время изменится из-под него. Поле «минуты» станет недействительным после смены часа. В этом случае принимаются только звездочки. Перезапустите cron и попробуйте снова, не подключаясь к Интернету (чтобы у даты не было возможности перезагрузить один из серверов времени).
Знаки процента, опять
Чтобы подчеркнуть совет о знаках процента, вот пример того, что cron делает с ними:
создаст файл ~ / cron.out, содержащий 3 строки
Это особенно навязчиво при использовании
date
команды. Обязательно избегайте знаков процентаисточник
... /path/to/your/command >/tmp/mycommand.log 2>&1
sudo apt-get install postfix
Debian Linux и его производные (Ubuntu, Mint и т. Д.) Имеют некоторые особенности, которые могут помешать выполнению ваших заданий cron; в частности, файлы в
/etc/cron.d
,/etc/cron.{hourly,daily,weekly,monthly}
должны:Последний ранит регулярно ничего не подозревающих пользователей; в частности , любой скрипт , в одной из этих папок с именем
whatever.sh
,mycron.py
,testfile.pl
и т.д. , будут не выполняться, когда - либо.По моему опыту, этот конкретный момент был наиболее частой причиной невыполнения cronjob в Debian и его производных.
Смотрите
man cron
для более подробной информации, если это необходимо.источник
Если ваши cronjobs перестают работать, проверьте, что срок действия вашего пароля не истек., Поскольку после этого все задания cron прекращаются.
Будут сообщения,
/var/log/messages
подобные приведенным ниже, которые показывают проблемы с аутентификацией пользователя:источник
sudo -u root passwd
Необычные и нерегулярные графики
Cron - это все, что считается очень простым планировщиком, а синтаксис не позволяет администратору легко формулировать немного более необычные графики.
Рассмотрим следующую работу, которая обычно объясняется как «запускать
command
каждые 5 минут» :против:
который не всегда работает
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 и т. Д.), Создайте две партии: одну, которая запускается дважды в четные часы, и вторую, которая запускает только нечетные часы:
Запускайте свои партии реже
Вместо того, чтобы запускать пакет каждые 7 минут, что является сложным графиком для разбивки на несколько пакетов, просто запустите его каждые 10 минут.
Запускайте свои партии чаще (но не допускайте одновременного запуска нескольких партий)
Многие нечетные расписания развиваются, потому что время выполнения пакета увеличивается / колеблется, а затем партии планируются с небольшим дополнительным запасом прочности, чтобы предотвратить одновременное наложение и запуск последующих запусков одной и той же партии.
Вместо этого думайте по-другому и создайте cronjob, который изящно потерпит неудачу, когда предыдущий прогон еще не закончился, но который будет работать иначе. Смотрите этот Q & A :
Это почти сразу же начнет новый запуск после того, как завершится предыдущий запуск / usr / local / bin / частый_cron_job.
Начните свои партии чаще (но выходите изящно, когда условия не правильны)
Поскольку синтаксис cron ограничен, вы можете решить разместить более сложные условия и логику в самом пакетном задании (или в сценарии-оболочке вокруг существующего пакетного задания). Это позволяет вам использовать расширенные возможности ваших любимых языков сценариев, комментировать ваш код и предотвращать трудно читаемые конструкции в самой записи crontab.
В bash, то
seven-minute-job
будет выглядеть примерно так:Который вы можете затем безопасно (попытаться) запустить каждую минуту:
Другая, но похожая проблема заключалась бы в том, чтобы запланировать запуск пакета в первый понедельник каждого месяца (или во вторую среду) и т. Д. Просто запланируйте запуск пакета каждый понедельник и выходите, когда дата не находится между 1- м или 7- м и день недели не понедельник.
Который вы можете безопасно (попытаться) запустить каждый понедельник:
Не используйте cron
Если ваши потребности сложны, вы можете рассмотреть возможность использования более продвинутого продукта, который предназначен для запуска сложных расписаний (распределенных по нескольким серверам) и который поддерживает триггеры, зависимости заданий, обработку ошибок, повторные попытки и мониторинг повторных попыток и т. Д. " планирование работы и / или„автоматизация рабочей нагрузки“.
источник
PHP конкретные
Если у вас есть работа cron, например:
И в случае ошибок ожидайте, что они будут отправлены вам, а они нет - проверьте это.
PHP по умолчанию не отправляет ошибки в STDOUT. @ смотри https://bugs.php.net/bug.php?id=22839
Чтобы исправить это, добавьте в файл php.ini или в свою строку (или в свою оболочку bash для PHP) эти:
Первая настройка позволит вам иметь летальные исходы, такие как «Memory oops», а вторая - перенаправить их всех в STDERR. Только после того, как вы сможете хорошо выспаться, все будет отправлено на почту вашего root, а не только в журнал.
источник
Добавив мой ответ отсюда для полноты, и добавив еще один потенциально полезный ресурс:
cron
Пользователь имеет другой ,$PATH
чем вы:Частая проблема пользователи делают с
crontab
записями в том , что они забывают , чтоcron
работает в другом ,environment
чем они делают, вошедшим в системе пользователя. Например, пользователь создает программу или сценарий в своем$HOME
каталоге и вводит следующую команду для его запуска:Команда отлично запускается из его командной строки. Затем пользователь добавляет эту команду к своей
crontab
, но находит, что это не работает:Причиной сбоя в этом случае является то, что
./
местоположениеcron
пользователя отличается от местоположения вошедшего в систему пользователя. Тоenvironment
есть отличается! PATH является частьюenvironment
, и он обычно отличается дляcron
пользователя. Осложняет эту проблему то, чтоenvironment
forcron
не одинаков для всех дистрибутивов * nix , и существует несколько версийcron
Простое решение этой конкретной проблемы - дать
cron
пользователю полную спецификацию пути вcrontab
записи:Что такое
cron
пользовательenvironment
?В некоторых случаях нам может понадобиться полная
environment
спецификация дляcron
нашей системы (или нам может быть просто любопытно). Что такоеenvironment
дляcron
пользователя и чем оно отличается от нашего? Кроме того, нам может потребоваться информацияenvironment
для другогоcron
пользователя -root
например ... чтоroot
пользовательenvironment
используетcron
? Один из способов узнать это - попроситьcron
нас сказать:~/
) следующим образом (или с вашим редактором):/home/you/envtst.sh.out
. Эти выходные данные будут отображать текущую среду, в$USER
которую вы вошли как:crontab
для редактирования:crontab
:ОТВЕТ: Выходной файл
/home/you/envtst.sh.out
будет содержать списокenvironment
для «пользователя root cron». Как только вы это узнаете, измените вашуcrontab
запись соответственно.Я не могу указать график, который мне нужен в моей
crontab
записи:Запись в расписании для,
crontab
конечно, определена вman crontab
, и вы должны прочитать это. Тем не менее, чтениеman crontab
и понимание графика две разные вещи. И метод проб и ошибок в спецификации расписания может стать очень утомительным. К счастью, есть ресурс, который может помочь: гуру crontab. , Введите спецификацию вашего расписания, и оно объяснит расписание на простом английском языке.Наконец, и рискуя оказаться лишним с одним из других ответов здесь, не поймайте себя на мысли, что вы ограничены одной
crontab
записью, потому что у вас есть одна работа, которую нужно запланировать. Вы можете использовать столькоcrontab
записей, сколько вам нужно, чтобы получить расписание, которое вам нужно.источник