Описание тега crontab

Файл crontab определяет команды оболочки, которые должны выполняться периодически по заданному расписанию. Пожалуйста, просмотрите вики по тегам для получения советов по устранению неполадок перед публикацией!

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

Каждая строка файла crontab представляет задание и состоит из выражения CRON, за которым следует команда оболочки для выполнения.

Основной формат

 +---------------- minute (0 - 59)
 |  +------------- hour (0 - 23)
 |  |  +---------- day of month (1 - 31)
 |  |  |  +------- month (1 - 12)
 |  |  |  |  +---- day of week (0 - 6) (Sunday=0 or 7)
 |  |  |  |  |
 *  *  *  *  *  command to be executed 

Популярные вопросы


Некоторые реализации cron, например, в популярной 4-й редакции BSD, написанной Полом Викси и включенной во многие дистрибутивы Linux, добавляют шестое поле в формат: имя пользователя учетной записи, под которым будет выполняться указанное задание (при условии наличия пользователя и разрешения).

Это разрешено только в системных таблицах crontab, но не в других, каждая из которых назначена для настройки одному пользователю.
Шестое поле также иногда используется для года вместо имени пользователя учетной записи, это делает демон nncron для Windows.

Однако Vixie cron не использует шестой столбец как год и, если он используется, будет рассматривать год как команду для запуска и сбоя.

Для "дня недели" (поле 5) и 0, и 7 считаются воскресеньем, хотя некоторые версии Unix, такие как AIX, не указывают "7" как допустимое на странице руководства.

Хотя обычно задание выполняется, когда все поля спецификации времени / даты соответствуют текущему времени и дате, есть одно исключение: если ограничены и "день месяца", и "день недели" (не *), то либо поле "день месяца" (3), либо поле "день недели" (5) должно соответствовать текущему дню.

Vixie cron поддерживает синтаксис расширенного выражения времени, где вы можете сказать, например, 5,35запускать задания в пять часов и пять минут второго; а также*/5запускать задание каждые пять минут / часов / дней / месяцев. Это несовместимо с традиционным / POSIXcron.

Отладка crontab

Есть несколько причин, по которым задание cron не запускается должным образом:

  1. Используя знаки процента, как в date +%F
  2. Неверное время
  3. Добавление или исключение имени пользователя в зависимости от
  4. Cron не работает
  5. Проблемы с синтаксисом или разрешениями
  6. Делать предположения об окружающей среде

Все это описано ниже.

Знаки процента

В crontab знаки процента заменены переводом строки. Это чрезвычайно распространенная проблема в заданиях резервного копирования, которые пытаются архивировать с отметкой времени, например

14 3 0 0 0 tar cfz /backup/file-$(date +%F).tar.gz /home

В %может быть экранирован обратной косой чертой, но обратная косая черта не удаляется. Это может вызвать дополнительную путаницу, поскольку экранирование работает дляdate +\%F, но не для wget "http://host/My\%20File.jpg".

Вместо этого поместите команду в файл сценария и запустите сценарий из crontab.

Неверное время

Люди часто ставят 1 * * * * mycommandв crontab, подождите несколько минут и задайтесь вопросом, почему их задание не выполняется. В данном случае это потому, что временная спецификация означает одну минуту прошедшего каждый час, а не каждую минуту. Попробуйте такой инструмент, как https://crontab.guru/, чтобы проверить свое время.

Чтобы проверить свою работу cron, используйте * * * * * если вы хотите запускать его часто (каждую минуту) во время тестирования.

Добавление или исключение имени пользователя

В некоторых системах есть /etc/crontab. В этом файле ожидается имя пользователя после временного интервала, например

57 1 * * * root rkhunter -c -sk

В обычных crontab, как видно с crontab -l, как для обычных пользователей, так и для root, имя пользователя не разрешено.

Задание не запустится, если имя пользователя добавлено в crontab -e или опущено в /etc/crontab.

Убедитесь, что вы знаете, какой тип crontab вы редактируете.

Cron может не работать

Не во всех системах cron установлен и запущен по умолчанию, и используйте, например, anacron вместо этого для периодического планирования.

ps aux | grep [c]ron отобразит демон cron, если он запущен.

Если кажется, что он работает, добавьте запись * * * * * touch /tmp/my_cronjob_ranи проверьте, создан ли файл через минуту. Вы также можете проверить системный журнал, чтобы увидеть список недавно выполненных заданий cron.

Проблемы с синтаксисом или разрешениями

Часто пытаются избежать проблем с оболочкой и символами, помещая команду в файл, но забывая chmod +x перед добавлением записи crontab.

Перед добавлением в crontab убедитесь, что команда работает в интерактивной оболочке.

Не сбрасывайте вывод проблемной команды! Если у вас проблемы с* * * * * command >/dev/null 2>&1затем удалите перенаправления и изучите вывод, прежде чем обращаться к нам за помощью.

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

Делать предположения об окружающей среде

Графические программы (приложения X11), Java-программы, ssh а также sudoзаведомо проблематично запускать как задания cron. Это потому, что они полагаются на вещи из интерактивных сред, которые могут отсутствовать в среде cron.

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

env -i sh -c 'yourcommand'

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

Общие проблемы обнаруживаются таким образом:

  • foo: Command not found или просто foo: not found.

    Более вероятный $PATH установлен в вашем .bashrcили аналогичный интерактивный файл инициализации. Попробуйте указать все команды по полному пути (или введитеsource ~/.bashrc в начале скрипта, который вы пытаетесь запустить).

  • Непонятные синтаксические ошибки оболочки

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

    Если в вашем файле сценария есть правильная строка shebang #!/bin/bash тогда он будет запущен запрошенным интерпретатором вместо sh.

  • unable to open display

    Вы пытаетесь запустить графическую программу, но не указываете где (Unix никогда ничего не показывает на "экране", он показывает только "на экране"). Положитьexport DISPLAY=:0в начале вашего скрипта, если вы хотите попробовать открыть программу на первом экране. Это не удастся, если никто не вошел в систему в то время, и может вызвать странности на дисплее коллеги, если кто-то вошел в систему на первом дисплее, но это не вы.

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

  • Запрос любого пароля

    Если ssh или sudoзапрашивает пароль, он завершится ошибкой в ​​cron, так как задания выполняются в фоновом режиме без взаимодействия пользователя с ними. Убедитесь, что они настроены для автоматических, неинтерактивных операций.

    За ssh, это означает установку пары ключей и выполнение этого без парольной фразы (поскольку ssh-agent не используется для разблокировки ключей). Попытка повторить пароль для ssh не работает.

    За sudo, это означает добавление записей в sudoersчтобы разрешить выполнение команды без пароля и без использования tty. В Unix & Linux Stack Exchange есть несколько сообщений о том, как.

Это все еще не работает!

Таким образом, вы можете запускать простые команды, например touch /tmp/my_cronjob_ran просто хорошо?

И ваша желаемая команда не содержит %s и отлично работает с env -i sh -c 'yourcommand'?

Все еще нормально работает с env -i sh -c 'nohup yourcommand' или env -i sh -c 'yourcommand </dev/null'? Если нет, то проблема возникает, когда у него нет стандартного ввода и / или управляющего терминала.

И все же cron не работает?

Добавьте логирование в свою команду с помощью * * * * * yourcommand >> /tmp/mylog 2>&1 затем изучите /tmp/mylog который будет записывать вывод и ошибки в /tmp/mylog. Не забывайте это, потому что вы используете>>(добавить перенаправление), самые новые записи будут в конце файла. У вас могут быть ошибки вверху, и вы обнаружите, что только на полпути вниз вы устранили проблему. Если вы посмотрите только на верхнюю часть файла, вы пропустите изменения, происходящие внизу.

Если после прочтения /tmp/mylogВы все еще не знаете, что случилось, пора задать вопрос. Не забудьте включить в свой пост соответствующий вывод из этого файла.