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

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

Ответ 1

Добавьте это в свой cron:

30 08 * * * env > ~/cronenv

После этого выполните следующее:

env - `cat ~/cronenv` /bin/sh

Это предполагает, что ваш cron запускает /bin/sh, который является значением по умолчанию, независимо от оболочки по умолчанию пользователя.

Ответ 2

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

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

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

Ответ 3

Пара подходов:

  1. Экспортируйте cron env и отправьте его:

    Добавить

    * * * * * env > ~/cronenv
    

    в свой crontab, дайте ему поработать один раз, выключите его и запустите

    env - 'cat ~/cronenv' /bin/sh
    

    И теперь вы находитесь в сеансе sh, в котором есть cron-окружение

  2. Перенеси свою среду в cron

    Вы можете пропустить вышеупомянутое упражнение и просто сделать . ~/.profile перед своей работой cron, например,

    * * * * * . ~/.profile; your_command
    
  3. Используйте экран

    Выше двух решений все еще не удается, поскольку они предоставляют среду, подключенную к запущенному сеансу X, с доступом к dbus и т.д. Например, в Ubuntu nmcli (Network Manager) будет работать в двух вышеуказанных подходах, но все равно не сможет в хрон.

    * * * * * /usr/bin/screen -dm
    

    Добавьте указанную выше строку в cron, дайте ей один раз поработать, выключите ее. Подключитесь к сеансу экрана (экран -r). Если вы проверяете, что сеанс экрана был создан (с ps), имейте в виду, что они иногда находятся в столицах (например, ps | grep SCREEN)

    Теперь даже nmcli и тому подобное не получится.

Ответ 4

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

env - your_command arguments

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

Ответ 6

Ответ на шесть лет спустя: проблема несоответствия среды - одна из проблем, решаемых таймерами 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, есть немного больше времени, чтобы настроить их. Сначала вы создаете "служебный" файл, чтобы определить, что вы хотите запустить, и файл "таймер", чтобы определить расписание для его запуска и, наконец, "включить" таймер для его активации.

Ответ 7

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

Ответ 8

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

http://libslack.org/daemon/

Ответ 9

По умолчанию cron выполняет свои задания с использованием любой вашей системной идеи sh. Это может быть фактическая оболочка Bourne или dash, ash, ksh или bash (или другая), символически привязанная к sh (и, как результат, работающая в режиме POSIX).

Лучше всего сделать, чтобы убедиться, что ваши скрипты имеют то, что им нужно, и предположить, что для них ничего не предусмотрено. Поэтому вы должны использовать полные спецификации каталога и задавать переменные окружения, такие как $PATH самостоятельно.

Ответ 10

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

Редактирование файла /etc/cron.d/ script:

* * * * * 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

Ответ 11

Ответ fooobar.com/questions/31864/... показывает, как получить среду cron и использовать ее для вашего script. Но имейте в виду, что среда может отличаться в зависимости от используемого вами файла crontab. Я создал три разных записи cron, чтобы сохранить среду через env > log. Это результаты на Amazon Linux 4.4.35-33.55.amzn1.x86_64.

1. Глобальный /etc/crontab с пользователем root

MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PWD=/
LANG=en_US.UTF-8
SHLVL=1
HOME=/
LOGNAME=root
_=/bin/env

2. Пользователь crontab root (crontab -e)

SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
PWD=/root
LANG=en_US.UTF-8
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env

3. Script в /etc/cron.hourly/

MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
_=/bin/env
PWD=/
LANG=en_US.UTF-8
SHLVL=3
HOME=/
LOGNAME=root

Самое главное PATH, PWD и HOME отличаются. Не забудьте установить их в сценариях cron, чтобы полагаться на стабильную среду.

Ответ 12

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