Как исправить все ваши проблемы / проблемы, связанные с crontab (Linux)
Это вики сообщества , если вы заметили что-то неправильное в этом ответе или у вас есть дополнительная информация, пожалуйста, отредактируйте ее.
Во-первых, основная терминология:
- cron (8) - это демон, который выполняет запланированные команды.
- crontab (1) - программа, используемая для изменения пользовательских файлов crontab (5).
- crontab (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, как сформулировать команду:
Команда crontab представлена одной строкой. Вы не можете использовать \
для расширения команды на несколько строк. Знак hash ( #
) представляет комментарий, который означает, что все в этой строке игнорируется cron. Ведущие пробелы и пустые строки игнорируются.
Будьте ОЧЕНЬ осторожны при использовании %
знака процента ( ) в вашей команде. Если они не экранированы, \%
они преобразуются в символы новой строки, и все, что после первого неэкранированного %
, передается вашей команде на стандартный ввод.
Существует два формата файлов 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 отправляет любые выходные данные команды пользователю, для которого она выполняет команду. Если нет вывода, не будет почты. Если вы хотите, чтобы cron отправлял почту на другую учетную запись, вы можете установить переменную среды MAILTO в файле crontab, например
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
Захватите результат самостоятельно
Вы можете перенаправить stdout и stderr в файл. Точный синтаксис для захвата вывода может варьироваться в зависимости от того, что использует оболочка cron. Вот два примера, которые сохраняют весь вывод в файл по адресу /tmp/mycommand.log
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
Посмотри логи
Cron регистрирует свои действия через системный журнал, который (в зависимости от вашей настройки) часто идет в /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 2 * * * /path/to/your/command
Укажите подходящий путь в файле crontab
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
Если вашей команде требуются другие переменные окружения, вы также можете определить их в файле 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}, и он не запускается
- Убедитесь, что имя файла не имеет расширения, см. Run-parts
- Убедитесь, что файл имеет разрешения на выполнение.
- Скажите системе, что использовать при выполнении вашего скрипта (например, поставить
#!/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")"