2017-02-08 2 views
19

Я рассматривал другие вопросы переполнения стека, но не мог заставить их работать. У меня есть скрипт python, который использует переменные среды. Этот скрипт работает точно так же, как и планировалось при запуске напрямую, но я хотел бы запускать его как задание cron каждую минуту.Переменные среды, когда скрипт python выполняется cron

В настоящее время в моем каталоге cron.d У меня есть файл с именем скребки, содержащей:

* * * * * root /usr/bin/python3.5 /code/scraper.py 

Это запускает сценарий питона, но сценарий не удается, как в скрипте я использую две переменные окружения.

Я читал, что я должен добавить SHELL =/bin/bash в файл cron, поэтому я это сделал, но это не помогло.

SHELL=/bin/bash 
* * * * * root /usr/bin/python3.5 /code/scraper.py 

Затем я прочитал

В кронтаб, прежде чем командовать, добавить. $ HOME/.profile.

SHELL=/bin/bash 
* * * * * . $HOME/.profile; root /usr/bin/python3.5 /code/scraper.py 

, но это вызвало хрон остановить работу в целом. Каков наилучший способ «отправки» переменных env в cron?

+0

попробуйте добавить 'source ~/.bashrc && command' или файл, в котором объявлены ваши переменные env, и посмотреть, работает ли он. – franklinsijo

+0

@franklinsijo Извините, я не совсем уверен, что я должен делать. При настройке контейнеров переменные env объявляются в файле компоновки docker. –

+0

, и эти переменные являются теми, которые будут использоваться scraper.py? – franklinsijo

ответ

2

Вы можете установить переменную инлайн ENV:

* * * * * root ENV_VAR=VALUE /usr/bin/python3.5 /code/scraper.py

Другой способ заключается в использовании honcho, что вы можете передать файл с ENV переменными.

honcho -e /path/to/.env run /code/scraper.py

+0

Есть ли способ, чтобы все значения env проходили через cron? –

+0

Переменные Env наследуются от родительского процесса. – fabiocerqueira

3

Вместо выполнения всей ~/.profile, что я хотел бы сделать, это переместить переменные, которые должны быть разделены между вашими cron рабочих мест и учетной записи, имеющей профиль, то я бы источник их обоих в ~/.profile и в работе cron.

Последняя попытка, которую вы показываете в вопросе, неправильно отформатирована. Идентификатор пользователя должен поступать сразу после информации о планировании, но вы добавили источник профиля до идентификатора пользователя, который, безусловно, не может работать.

Вот пример настройки, которые я тестировал здесь:

*/1 * * * * someuser . /tmp/t10/setenv && /usr/bin/python /tmp/t10/test.py 

Я установил, чтобы выполнить каждую минуту для целей тестирования. Замените someuser тем, что имеет смысл. Сценарий /tmp/t10/setenv я имел это:

export FOO=foovalue 
export BAR=barvalue 

Файл /tmp/t10/test.py было это:

import os 

print os.environ["FOO"], os.environ["BAR"] 

Мои хрон письма Me выходе из сценариев он работает.Я получил письмо с этим выходом:

foovalue barvalue 
+0

'setenv && test.py', эквивалентен системному вызову' test.py' в 'setenv', он будет и должен определенно работать лучше, чем мой, чтобы поместить системный вызов test.py в один файл. Мне нравится этот подход. – Gang

+0

Спасибо, он отлично сработал для меня. Очень полезный пост. –

1

Вы можете указать две переменные окружения этим:

* * * * * root env A=1 B=2 /usr/bin/python3.5 /code/scraper.py 

env является системной программой, которая запускает указанную программу с дополнительными переменными:

$ env A=1 B=2 /bin/sh -c 'echo $A$B' # or just 'sh': would search in $PATH 
12 
+0

с 2 vars env, это должно работать. – Gang

0

Это один из подход, который мне нравится, написать сценарий для установки среды и выполнить скрипт с его параметрами в качестве параметров

set_env_to_process.sh

#!/usr/bin/env bash 
echo "TEST_VAR before export is: <$TEST_VAR>" 

export TEST_VAR=/opt/loca/netcdf 
echo "TEST_VAR after export is: <$TEST_VAR>" 
export PATH=$PATH:/usr/bin/python3.5 
export PYTHTONPATH=$PYTHONPATH:/my/installed/pythonpath 

# execute command and its parameters as input for this script 
if [ $# -eq 0 ]; then 
    echo "No command to execute" 
else 
    echo "Execute commands with its parameters: [email protected]" 
    eval [email protected] 
fi 

использование

/usr/bin/python3.5 /code/scraper.py принимаются в качестве входных данных для set_env_to_process.sh set_env_to_process.sh установить правильный окр для сценария для запуска

Он может быть использован в качестве командной строки, хрон, Судо , ssh для настройки env

* * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py 
Смежные вопросы