Вручную запустить задание cron / имитировать работу cron?

Я новичок в cron, и я хочу проверить, если почтовая рассылка cron после выполненной задачи и тому подобное. Есть ли более элегантный способ проверить это, а затем установить задание cron для запуска каждые несколько секунд? Итак, есть ли способ имитировать выполнение задания cron / запустить задание cron вручную, но с тем же самым поведением, которое он мог бы выполнять при запуске cron?

3 Solutions collect form web for “Вручную запустить задание cron / имитировать работу cron?”

Основное различие между выполнением задания cron в командной строке и внутри cron – это его среда. Другие потенциальные различия включают текущий каталог, доступность терминала и оболочку.

Это довольно точное моделирование работы cron с помощью cron. Чтобы избежать различий из-за оболочки, поместите свою работу в скрипт и поместите только путь к этому скрипту в crontab. Обратите внимание, что точное множество и значения переменных среды, передаваемых cron, зависят от реализации; проверьте crontab(5) страницу crontab(5) в вашей системе. ifne – это команда, которая запускает команду, указанную в аргументах, если она получает некоторый ввод; есть еще один.

 env -i HOME="$HOME" LOGNAME="$LOGNAME" PATH=/usr/bin:/bin SHELL=/bin/sh USER="$USER" \ /path/to/script </dev/null 2>&1 | ifne mail -r "Cron Daemon" -s "Cron <$USER@$(hostname)> /path/to/script" "$USER" 

Другой способ создания cron-подобной настройки – через. Но at выполнении команды с переменными среды, которые были получены at процессе, вам все равно нужно эмулировать эту часть.

 echo /path/to/script | env -i HOME="$HOME" LOGNAME="$LOGNAME" PATH=/usr/bin:/bin SHELL=/bin/sh USER="$USER" \ at now 

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

Я создал скрипт под названием dumpenv :

 #!/bin/sh base=$(basename $0) env -0 > /tmp/$base.$$.dump 

Это сбрасывает все переменные среды в файл в /tmp/ . Затем я изменил свой crontab, чтобы добавить:

 */1 * * * * [path to newly created script] 

Это заставляет скрипт запускаться каждую минуту. Итак, через минуту я получил свалку среды, которую видят задачи, выполняемые cron. Если для линии crontab осталось больше минуты, она создает кучу идентичных файлов с именами, отличающимися только частью pid имени файла ( $$ ). Нет, biggie. Я мог бы закодировать эту возможность, чтобы получить только один файл, но основной принцип здесь «достаточно хорош», и я могу использовать dumpenv в других контекстах, где много дампов полезны. Во всяком случае, желательно удалить линию crontab, которая была добавлена, чтобы избежать /tmp большим количеством нежелательной информации.

Затем я создал дополнительный файл, который я вызвал /tmp/command котором содержалась команда, которую я хотел выполнить, в одной строке, завершенной нулевым символом. Нулевой символ необходим.

Затем я издал:

 cat [path to dumpfile crated earlier] /tmp/command | xargs -0 -x env -i 

И это повторило ошибку, которую я видел, когда моя команда выполнена из cron. Что такое xargs , так это команда команды:

 env -i [list of environment variables] [command to execute] 

и выполняет его. Список переменных окружения поступает из файла дампа. Команда env выполняется из файла /tmp/command .

Аргументы -0 для env и xargs и требуемый нулевой символ, о котором я упоминал выше, – это предотвращение изменения среды при переходе переменных. В тех случаях, когда среда не содержит переменную среды с новой строкой в ​​ней, -0 возможно, можно исключить из вызова env в сценарии dumpenv и из команды xargs , а файл /tmp/command не потребует нулевого символа как терминатор линии.

Я не делаю явного перенаправления stdin на / dev / null, потому что xargs делает это для меня. Я также не забочусь о перенаправлении stdout / stderr, и я не хочу получать электронное сообщение, если команда не удалась. Для случаев, когда эти функции желательны, ответ Гилле предоставляет средства для этого.

Ответ Луи замечателен. Я предлагаю небольшое улучшение.

Вместо создания файла /tmp/command который содержит путь к сценарию, который вы хотите выполнить, как предложил Луис в следующем коде:

 cat [path to dumpfile crated earlier] /tmp/command | xargs -0 -x env -i 

Вместо этого вы можете назвать скрипт непосредственно в команде с помощью следующей альтернативной команды (обратите внимание на \x00 добавленную к пути сценария cron, что необходимо:

 printf "/path/to/cron/script\x00" | cat /path/to/dumpfile/created/earlier - | xargs -0 -x env -i 

Это позволяет избежать необходимости создавать /tmp/command file /tmp/command .

  • Как написать это расписание в crontab?
  • Создание задания cron и просмотр его вывода в режиме реального времени
  • Начало работы Crontab +1 мин после @reboot
  • Правильный формат cron
  • Сохраняйте вывод arp в терминале в текстовый файл каждую минуту, используя crontab
  • cron, каждую минуту
  • В crontab @reboot работает, но не работает
  • Конфликт между cron.deny и разрешить, кто победит?
  • Работы Cron работают на 1 час, в общем несогласие с системными временами
  • Задача Cron начинается в 5:30 и выполняется каждые 5 минут один раз
  • Crontab: переменные в полях даты / времени
  • Linux и Unix - лучшая ОС в мире.