Пусть 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
У меня есть еще одно решение этой проблемы:
В этом случае он выберет все переменные среды, определенные в вашем
$HOME/.profile
файле.Конечно,
$HOME
также не установлен, вы должны заменить его на полный путь вашего$HOME
.источник
source ~/.bashrc
, и оказалось, что мой.bashrc
файл как бы конфликтует с заданием cron. Если я использую очень простой.env_setup_rc
файл с одной строкой:export MY_ENV_VAR=my_env_val
он действительно работает. Смотрите мой пост: stackoverflow.com/questions/15557777/…Настройка Vars в
/etc/environment
также работал для меня в Ubuntu. Начиная с 12.04, переменные в/etc/environment
загружаются для cron.источник
env >> /etc/environment
и все текущие переменные env теперь доступны в заданиях CRON.env >> /etc/environment
неудачу, если в одной из переменных среды есть хэш Мне было труднее всего устранить неполадки в моем приложении. Это оказался пароль, содержащий «#», который усекался на этом этапе.Если вы запускаете сценарии, которые выполняете через cron, с помощью:
Они должны подобрать
~/.bash_profile
переменные вашей средыисточник
root
crontab? В/home/root
моей системе нет папки, и поэтому я не вижу, как это будет работать сroot
crontab. Идеи?#!/bin/bash
. Волшебство здесь, чтобы добавить-l
Расширение примера @carestad, которое мне кажется более простым, - это запустить скрипт с помощью cron и иметь среду в скрипте.
В файле crontab -e:
В файле cron_job.sh:
Любая команда после источника .bash_profile будет иметь вашу среду, как если бы вы вошли в систему.
источник
Для меня я должен был установить переменную окружения для приложения php. Я восстановил его, добавив следующий код в мой crontab.
кронтаб:
и внутри doSomethingWonderful.php я могу получить значение среды с помощью:
Надеюсь, это поможет!
источник
Все, что вы установили,
crontab
будет доступно в cronjobs, как напрямую, так и с использованием переменных в скриптах.Используйте их в определении cronjob
Вы можете настроить
crontab
так, чтобы он устанавливал переменные, которые затем может использовать cronjob:Теперь файл
/tmp/hello
показывает такие вещи, как:Используйте их в скрипте, запущенном cronjob
Вы можете настроить
crontab
так, чтобы он устанавливал переменные, которые затем могут использовать сценарии:И скажем сценарий
/tmp/myscript.sh
так:Создает файл,
/tmp/myoutput.res
показывающий:источник
Расширение @Robert Brisita только что расширилось, также, если вы не хотите устанавливать все переменные профиля в скрипте, вы можете выбрать переменные для экспорта в верхней части скрипта
В файле crontab -e:
В script.sh
источник
Вместо того
Используйте bash -l -c
источник
-l
например#!/bin/bash -l
:? Этот другой ответ прост и элегантен.Я использую
Oh-my-zsh
в своем macbook, поэтому я пробовал много вещей, чтобы запустить задачу crontab, но, наконец, мое решение было предваряется.zshrc
перед выполнением команды.Эта задача выполняется каждые 30 минут и использует
.zshrc
профиль для выполнения команды моего узла.Не забудьте использовать точку перед
$HOME
вар.источник
Другой способ - вдохновленный этим ответом - «ввести» переменные заключается в следующем (пример fcron):
От
help set
:Таким образом, все, что находится между ними
set -
иset +
экспортируется вenv
них, затем становится доступным для других сценариев и т. Д. Без использованияset
переменных получают источники, но живутset
только в них.Кроме того, полезно также передавать переменные, когда программе требуется учетная запись без полномочий root, но вам понадобятся некоторые переменные в среде этого другого пользователя. Ниже приведен пример передачи в nullmailer vars для форматирования заголовка электронной почты:
источник
Я попробовал большинство предоставленных решений, но сначала ничего не получалось. Оказывается, однако, что это не были решения, которые не работали. Видимо, мой
~/.bashrc
файл начинается со следующего блока кода:По сути, это
case statement
проверяет текущий набор параметров в текущей оболочке, чтобы определить, что оболочка работает в интерактивном режиме. Если оболочка работает в интерактивном режиме, она переходит к поиску~/.bashrc
файла. Тем не менее, в оболочке , вызываемойcron
, то$-
переменная не содержитi
значение , которое указывает на интерактивность. Поэтому~/.bashrc
файл никогда не получает полностью. В результате переменные среды никогда не устанавливались. Если это ваша проблема, не стесняйтесь закомментировать блок кода следующим образом и попробуйте снова:Я надеюсь, что это окажется полезным
источник
Вы также можете добавить к своей команде команду
env
для добавления переменных окружения следующим образом:источник