У меня обычно есть несколько проблем с тем, как cron выполняет сценарии, так как они обычно не имеют моей настройки среды. Есть ли способ вызвать bash (?) Таким же образом, как это делает cron, чтобы я мог тестировать сценарии перед их установкой?
253
Ответы:
Добавьте это в ваш crontab (временно):
После запуска сделайте это:
Это предполагает, что ваш cron запускает / bin / sh, который используется по умолчанию независимо от оболочки пользователя по умолчанию.
источник
env -
кошка ~ / cronenv` / бен / sh` должно быть написано , как хроны также? приведите пожалуйста примерCron предоставляет только эту среду по умолчанию:
HOME
домашний каталог пользователяLOGNAME
логин пользователяPATH=/usr/bin:/usr/sbin
SHELL=/usr/bin/sh
Если вам нужно больше, вы можете создать сценарий, в котором вы определяете свою среду перед таблицей планирования в crontab.
источник
.
как правило, больше не является частьюPATH
по соображениям безопасности .Пара подходов:
Экспортируйте cron env и поставьте его:
Добавить
в ваш crontab, дайте ему один раз запустить, выключите его, затем запустите
И теперь вы находитесь в
sh
сеансе, в котором есть среда cronПринеси свое окружение в cron
Вы можете пропустить вышеупомянутое упражнение и просто сделать
. ~/.profile
перед своей работой, например:Использовать экран
Вышеперечисленные два решения по-прежнему терпят неудачу в том, что они предоставляют среду, подключенную к запущенному сеансу X, с доступом к ним
dbus
и т. Д. Например, в Ubuntunmcli
(Network Manager) будет работать в двух вышеупомянутых подходах, но все равно не будет работать в cron.Добавьте указанную выше строку в cron, дайте ей один раз поработать, снова выключите. Подключитесь к сеансу экрана (screen -r). Если вы проверяете, что сеанс экрана был создан (с
ps
), имейте в виду, что они иногда в столицах (напримерps | grep SCREEN
)Теперь даже
nmcli
и подобное не получится.источник
Вы можете запустить:
Это запустит your_command с пустой средой.
источник
env - HOME="$HOME" LOGNAME="$USER" PATH="/usr/bin:/bin" SHELL="$(which sh)" command arguments
который, кажется, делаетВ зависимости от оболочки аккаунта
или
От http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html
источник
Отвечая шесть лет спустя: проблема несоответствия среды является одной из проблем, решаемых
systemd
«таймерами» в качестве замены хрон. Независимо от того, запускаете ли вы «service» systemd из CLI или через cron, он получает точно такую же среду, избегая проблемы несоответствия среды.Наиболее распространенная проблема, приводящая к сбою заданий cron при их ручном прохождении, - это ограничение по умолчанию,
$PATH
установленное cron, например, в Ubuntu 16.04:В отличие от этого , по умолчанию
$PATH
установленныйsystemd
на Ubuntu 16.04 является:Так что уже есть больше шансов, что системный таймер найдет двоичный файл без лишних хлопот.
Недостаток системных таймеров - немного больше времени для их настройки. Сначала вы создаете файл «service», чтобы определить, что вы хотите запустить, и файл «timer», чтобы определить расписание его запуска и, наконец, «включить» таймер, чтобы активировать его.
источник
Создайте задание cron, которое запускает env и перенаправляет stdout в файл. Используйте файл вместе с «env -», чтобы создать ту же среду, что и задание cron.
источник
Не забывайте, что, поскольку родитель cron является init, он запускает программы без управляющего терминала. Вы можете смоделировать это с помощью такого инструмента:
http://libslack.org/daemon/
источник
По умолчанию
cron
выполняет свои задания, используя то, о чем ваша система представляетsh
. Это может быть фактическим Борна оболочка илиdash
,ash
,ksh
илиbash
(или другой) слинковано вsh
(и , как следствие , работающем в режиме POSIX).Лучше всего убедиться, что в ваших скриптах есть то, что им нужно, и предположить, что для них ничего не предусмотрено. Поэтому вы должны использовать полные спецификации каталогов и устанавливать такие переменные среды, как
$PATH
вы.источник
0 0 * * 1 /path/to/executable >/dev/null 2>&1
затем в «исполняемом файле» я бы установил значения$PATH
и т. Д., А также использовал полные спецификации каталогов для ввода и вывода файлов и т. Д. Например:/path/to/do_something /another/path/input_file /another/path/to/output_file
Другой простой способ, который я нашел (но может быть подвержен ошибкам, я все еще тестирую), состоит в том, чтобы найти файлы профиля вашего пользователя перед вашей командой.
Редактирование скрипта /etc/cron.d/:
Превратился бы в:
Грязный, но он сделал работу за меня. Есть ли способ симулировать логин? Просто команда, которую вы могли бы запустить?
bash --login
не работал Похоже, это был бы лучший путь.РЕДАКТИРОВАТЬ: Это, кажется, твердое решение: http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/
источник
Принятый ответ дает возможность запустить скрипт в среде, которую будет использовать cron. Как отмечали другие, это не единственный необходимый критерий для отладки заданий cron.
Действительно, cron также использует неинтерактивный терминал, без подключенного входа и т. Д.
Если это поможет, я написал скрипт, который позволяет безболезненно запускать команду / скрипт, как это будет выполняться cron. Вызовите его с помощью команды / скрипта в качестве первого аргумента, и все в порядке.
Этот скрипт также размещен (и, возможно, обновлен) на Github .
источник
Ответ https://stackoverflow.com/a/2546509/5593430 показывает, как получить среду cron и использовать ее для своего сценария. Но имейте в виду, что среда может отличаться в зависимости от используемого файла crontab. Я создал три разные записи cron, чтобы сохранить среду через
env > log
. Это результаты на Amazon Linux 4.4.35-33.55.amzn1.x86_64.1. Глобальный / etc / crontab с пользователем root
2. Пользовательский crontab root (
crontab -e
)3. Сценарий в /etc/cron.hourly/
Самое главное
PATH
,PWD
иHOME
отличаются. Обязательно установите их в своих скриптах cron, чтобы они полагались на стабильную среду.источник
Я не верю, что есть; единственный способ проверить работу cron - это настроить ее на запуск через минуту или две, а затем подождать.
источник