bash - Как имитировать среду cron выполняет скрипт?




6 Answers

Cron предоставляет только эту среду по умолчанию:

  • Домашний домашний каталог HOME
  • LOGNAME пользователя LOGNAME
  • PATH=/usr/bin:/usr/sbin
  • SHELL=/usr/bin/sh

Если вам нужно больше, вы можете указать сценарий, в котором вы определяете свою среду перед таблицей планирования в crontab.

bash scripting cron

У меня обычно есть несколько проблем с тем, как cron выполняет скрипты, поскольку у них обычно нет моей настройки среды. Есть ли способ вызвать bash (?) Так же, как cron делает так, что я могу протестировать скрипты перед их установкой?




Вы можете запустить:

env - your_command arguments

Это запустит команду your_command с пустой средой.




Ответ на шесть лет спустя: проблема несоответствия среды является одной из проблем, решаемых systemd «таймерами» в качестве замены cron. Независимо от того, запускаете ли вы системный «сервис» из CLI или через cron, он получает точно такую ​​же среду, избегая проблемы несоответствия среды.

Наиболее распространенная проблема, вызвавшая сбой выполнения заданий cron при передаче вручную, - это ограничение по умолчанию $PATH установленное cron, что и на Ubuntu 16.04:

"/usr/bin:/bin"

Напротив, по умолчанию $PATH установленный systemd на Ubuntu 16.04, является:

"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Таким образом, уже есть больше шансов, что системный таймер найдет двоичный файл без дальнейших хлопот.

Недостаток с таймерами systemd, есть немного больше времени, чтобы настроить их. Сначала вы создаете «служебный» файл, чтобы определить, что вы хотите запустить, и файл «таймер», чтобы определить расписание для его запуска и, наконец, «включить» таймер для его активации.




Не забывайте, что, поскольку родительский cron является init, он запускает программы без управляющего терминала. Вы можете имитировать это с помощью такого инструмента:

http://libslack.org/daemon/




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

Редактирование сценария /etc/cron.d/:

* * * * * user1 comand-that-needs-env-vars

Включилось бы в:

* * * * * user1 source ~/.bash_profile; source ~/.bashrc; comand-that-needs-env-vars

Грязный, но это заработало для меня. Есть ли способ имитировать логин? Просто команда, которую вы могли бы запустить? bash --login не работает. Похоже, это был бы лучший способ пойти, хотя.

EDIT: похоже, это надежное решение: http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/

* * * * * root su --session-command="comand-that-needs-env-vars" user1 -l



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




Related