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


Answers

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

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

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

Question

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




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

Редактирование сценария /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



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

env - your_command arguments

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




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




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

http://libslack.org/daemon/




Создайте задание cron, которое запускает env и перенаправляет stdout в файл. Используйте файл вместе с «env -» для создания той же среды, что и задание cron.