Где я могу установить переменные окружения, которые будет использовать crontab? - PullRequest
235 голосов
/ 09 февраля 2010

У меня crontab работает каждый час. Пользователь, запускающий его, имеет переменные окружения в .bash_profile, которые работают, когда пользователь запускает задание из терминала, однако, очевидно, что они не обнаруживаются crontab при запуске.

Я пытался установить их в .profile и .bashrc, но, похоже, они все еще не подобраны. Кто-нибудь знает, где я могу поместить переменные среды, которые crontab может взять?

Ответы [ 12 ]

224 голосов
/ 18 мая 2012

Вы можете определить переменные окружения в самом 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 в настоящее время используют vixie-cron , что позволяет объявлять их в файле crontab (также GNU mcron ).

Archlinux и RedHat используют cronie , который не позволяет объявлять переменные окружения и генерирует синтаксические ошибки в cron. журнал. Обходной путь может быть сделан для каждой записи:

# m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
130 голосов
/ 27 ноября 2012

У меня есть еще одно решение этой проблемы:

0 5 * * * . $HOME/.profile; /path/to/command/to/run

В этом случае будут выбраны все переменные среды, определенные в вашем файле $ HOME / .profile.

Конечно, $ HOME также не установлен, вы должны заменить его на полный путь вашего $ HOME.

79 голосов
/ 09 февраля 2010

Пусть 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 $0`
cmd=${REAL_HOME:-/real/home}/bin/$base

if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi

exec $cmd ${@:+"$@"}

(Написано с использованием более старого стандарта кодирования - в настоящее время я бы использовал начальный символ "#!" В начале.)

'~ / .cronfile' - это вариант моего профиля для использования cron - строго неинтерактивный и не повторяющийся ради шумности. Вы можете организовать выполнение .profile и так далее. (Материал REAL_HOME - это артефакт моего окружения - вы можете притвориться, что он такой же, как $ HOME.)

Итак, этот код читает соответствующую среду, а затем выполняет не-Cron-версию команды из моего домашнего каталога. Так, например, моя команда 'weekday' выглядит так:

:       "@(#)$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
42 голосов
/ 28 декабря 2015

Установка переменных в /etc/environment также работала для меня в Ubuntu. Начиная с 12.04, переменные в /etc/environment загружаются для cron.

21 голосов
/ 06 сентября 2013

Расширение примера @carestad, которое мне кажется более простым, - это запустить скрипт с помощью cron и иметь среду в скрипте.

В файле crontab -e:

SHELL=/bin/bash

*/1 * * * * $HOME/cron_job.sh

В файле cron_job.sh:

#!/bin/bash
source $HOME/.bash_profile
some_other_cmd

Любая команда после источника .bash_profile будет иметь вашу среду, как если бы вы вошли в систему.

16 голосов
/ 30 июля 2018

Если вы запускаете скрипты, которые выполняете через cron, с:

#!/bin/bash -l

Они должны взять ваши ~/.bash_profile переменные окружения

14 голосов
/ 08 сентября 2014

Для меня мне пришлось установить переменную окружения для приложения 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"

Надеюсь, это поможет!

10 голосов
/ 12 мая 2016

Все, что вы установили в 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

И, скажем, сценарий /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
...
5 голосов
/ 03 марта 2018

вместо

0  *  *  *  *  sh /my/script.sh

Используйте bash -l -c

0  *  *  *  *  bash -l -c 'sh /my/script.sh'
4 голосов
/ 20 марта 2014

Расширение @Robert Brisita только что расширилось, также, если вы не хотите устанавливать все переменные профиля в скрипте, вы можете выбрать переменные для экспорта в верхней части скрипта

В файле crontab -e:

SHELL=/bin/bash

*/1 * * * * /Path/to/script/script.sh

В script.sh

#!/bin/bash
export JAVA_HOME=/path/to/jdk

some-other-command
...