Где я могу установить переменные среды, которые будет использовать crontab?
у меня есть файл crontab каждый час. Пользователь работает он variabless среды в .bash_profile
это работает, когда пользователь запускает задание с терминала, однако, очевидно, что они не попадают в crontab при его запуске.
Я попытался установить их в .profile
и .bashrc
но они, похоже, все еще не подобраны. Кто-нибудь знает, где я могу поместить среду vars, которую crontab может забрать?
12 ответов
есть 'cron' запустить сценарий оболочки, который устанавливает среду перед запуском команды.
всегда.
# @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
# Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min Hour Day Month Weekday Command
#-----------------------------------------------------------------------------
0 * * * * /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1 1 * * * /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23 1 * * 1-5 /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2 3 * * 0 /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21 3 1 * * /usr/bin/ksh /work1/jleffler/bin/Cron/monthly
скрипты в ~ / bin / Cron-это все ссылки на один скрипт "runcron", который выглядит так:
: "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
# Commands to be performed by Cron (no debugging options)
# Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile
base=`basename `
cmd=${REAL_HOME:-/real/home}/bin/$base
if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi
exec $cmd ${@:+"$@"}
(написано с использованием более старого стандарта кодирования-в настоящее время я бы использовал shebang '#!'в начале.)
в '~/.cronfile " - это вариант моего профиля для использования cron-строго неинтерактивный и без эха ради того, чтобы быть шумный. Вы могли бы организовать выполнение .профиль и так далее. (Материал REAL_HOME-это артефакт моей среды-вы можете притвориться, что он такой же, как $HOME.)
таким образом, этот код считывает соответствующую среду, а затем выполняет не-Cron версию команды из моего домашнего каталога. Так, например, моя команда "будний день" выглядит так:
: "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
# Commands to be done each weekday
# Update ICSCOPE
n.updics
команда "ежедневно" проще:
: "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
#
# Commands to be done daily
# Nothing -- most things are done on weekdays only
exit 0
вы можете определить переменные среды в самой crontab при запуске crontab -e
из командной строки.
LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h dom mon dow command
* * * * * sleep 5s && echo "yo"
эта функция доступна только для определенных реализаций cron. Ubuntu и Debian в настоящее время используют Викси-хрон что позволяет объявить их в файле crontab (также GNU mcron).
Archlinux и RedHat использовать cronie, который не разрешить переменные среды, которые будут объявлены и будут вызывать синтаксические ошибки в cron.бревно. Обходной путь может быть выполнен для каждой записи:
# m h dom mon dow command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
У меня есть еще одно решение этой проблемы:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
в этом случае он выберет всю переменную среды, определенную в вашем $HOME/.файл профиля.
конечно $HOME также не установлен, вы должны заменить его полным путем вашего $HOME.
установка vars в /etc/environment
также работал для меня в Ubuntu. Начиная с 12.04 переменные в /etc / environment загружаются для cron.
расширение на примере @carestad, который я нахожу проще, - это запустить скрипт с cron и иметь среду в скрипте.
в файле crontab-e:
SHELL=/bin/bash
*/1 * * * * $HOME/cron_job.sh
In cron_job.sh файл:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
любая команда после источник .файл будет иметь свою среду, как будто вы вошли в систему.
для меня мне пришлось установить переменную среды для приложения php. Я перенес его, добавив следующий код в свой crontab.
$ sudo crontab -e
crontab:
ENVIRONMENT_VAR=production
* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php
и внутри doSomethingWonderful.php я мог бы получить значение среды с помощью:
<?php
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"
надеюсь, это поможет!
все, что вы установите в crontab
будет доступен в cronjobs, как напрямую, так и с использованием переменных в скриптах.
используйте их в определении cronjob
вы можете настроить crontab
так что он устанавливает переменные, которые затем могут использовать cronjob:
$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello
файл /tmp/hello
показывает такие вещи, как:
$ cat /tmp/hello
hi man. date is Thu May 12 12:10:01 CEST 2016
hi man. date is Thu May 12 12:11:01 CEST 2016
используйте их в скрипте, запущенном cronjob
вы можете настроить crontab
так, что он устанавливает переменные, которые затем скрипты могут использовать:
$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh
и скажи script /tmp/myscript.sh
такой:
echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res
он генерирует файл /tmp/myoutput.res
показывает:
$ cat /tmp/myoutput.res
Now is Thu May 12 12:07:01 CEST 2016. myvar=hi man
Now is Thu May 12 12:08:01 CEST 2016. myvar=hi man
...
расширение на @Robert Brisita только что развернулось, также, если вы не хотите настраивать все переменные профиля в скрипте, вы можете выбрать переменные для экспорта в верхней части скрипта
в файле crontab-e:
SHELL=/bin/bash
*/1 * * * * /Path/to/script/script.sh
In script.sh
#!/bin/bash
export JAVA_HOME=/path/to/jdk
some-other-command
другой способ - вдохновленный этой ответ - для "инъекции" переменных используется следующее (пример fcron):
%daily 00 12 \
set -a; \
. /path/to/file/containing/vars; \
set +a; \
/path/to/script/using/vars
С help set
:
-переменные метки, которые изменяются или создаются для экспорта.
использование +, а не - приводит к отключению этих флагов.
так что все что между set -
и set +
получает ехпортированы к env
и затем доступен для других сценариев и т. д. Без используя set
переменные получают источник, но живут в set
только.
кроме того, также полезно передавать переменные, когда программа требует не корневой учетной записи для запуска, но вам понадобятся некоторые переменные внутри среды другого пользователя. Ниже приведен пример передачи в nullmailer vars для форматирования заголовка электронной почты:
su -s /bin/bash -c "set -a; \
. /path/to/nullmailer-vars; \
set +a; \
/usr/sbin/logcheck" logcheck
Я пробовал большинство предоставленных решений, но сначала ничего не работало. Оказывается, однако, что это не были решения, которые не сработали. По-видимому, мой ~/.bashrc
файл начинается со следующего блока кода:
case $- in
*i*) ;;
*) return;;
esac
в основном это case statement
это проверяет текущий набор параметров в текущей оболочке, чтобы определить, что оболочка работает в интерактивном режиме.
Если оболочка работает в интерактивном режиме, она переходит к поиску .
Однако, в оболочке, вызываемой cron
, the $-
переменная не содержит i
значение, которое указывает на интерактивность.
Следовательно,~/.bashrc
файл никогда не получает источник полностью. В результате переменные среды так и не были установлены.
Если это ваша проблема, не стесняйтесь комментировать блок кода следующим образом и повторите попытку:
# case $- in
# *i*) ;;
# *) return;;
# esac
надеюсь, это окажется полезным
Если вы запускаете скрипты, которые вы выполняете через cron с:
#!/bin/bash -l
они должны забрать свой ~/.файл переменные среды