У меня обычно есть несколько проблем с тем, как cron выполняет скрипты, поскольку у них обычно нет моей настройки среды. Есть ли способ вызвать bash (?) Так же, как cron делает так, чтобы я мог протестировать скрипты перед их установкой?
Как имитировать среду cron выполняет script с?
Ответ 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
Пара подходов:
Экспортируйте cron env и отправьте его:
Добавить
* * * * * env > ~/cronenv
в свой crontab, дайте ему поработать один раз, выключите его и запустите
env - 'cat ~/cronenv' /bin/sh
И теперь вы находитесь в сеансе
sh
, в котором есть cron-окружениеПеренеси свою среду в cron
Вы можете пропустить вышеупомянутое упражнение и просто сделать
. ~/.profile
перед своей работой cron, например,* * * * * . ~/.profile; your_command
Используйте экран
Выше двух решений все еще не удается, поскольку они предоставляют среду, подключенную к запущенному сеансу X, с доступом к
dbus
и т.д. Например, в Ubuntunmcli
(Network Manager) будет работать в двух вышеуказанных подходах, но все равно не сможет в хрон.* * * * * /usr/bin/screen -dm
Добавьте указанную выше строку в cron, дайте ей один раз поработать, выключите ее. Подключитесь к сеансу экрана (экран -r). Если вы проверяете, что сеанс экрана был создан (с
ps
), имейте в виду, что они иногда находятся в столицах (например,ps | grep SCREEN
)Теперь даже
nmcli
и тому подобное не получится.
Ответ 4
Вы можете запустить:
env - your_command arguments
Это запустит команду your_command с пустой средой.
Ответ 5
В зависимости от оболочки учетной записи
sudo su
env -i /bin/sh
или
sudo su
env -i /bin/bash --noprofile --norc
Из http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html
Ответ 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, он запускает программы без управляющего терминала. Вы можете имитировать это с помощью такого инструмента:
Ответ 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, - это настроить его на минуту или две в будущем, а затем ждать.