it-swarm.com.ru

Переменные окружения, когда скрипт на Python запускается cron

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

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

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

При этом запускается скрипт python, но скрипт завершается ошибкой, так как в скрипте я использую две переменные окружения. 

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

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

Потом читаю 

В crontab перед командой добавьте. $ HOME/.profile. 

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

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

22
user6723321

Вместо того, чтобы выполнять весь ~/.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"]

Мой cron посылает мне по электронной почте вывод скриптов, которые он запускает. Я получил письмо с таким выводом:

foovalue barvalue
5
Louis

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

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

Другой способ - использовать honcho , чтобы передать файл с переменными env.

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

3
fabiocerqueira

Вы можете добавить его в верхнюю часть вашего crontab и оставить его вне контроля версий. Допустим, переменная окружения, вызывающая у вас трудности, это export Django_SECRET_KEY="FOOBAR_1241243124312341234":

кронтаб

Django_SECRET_KEY="FOOBAR_1241243124312341234"

SCRIPT_NAME = my_cool_script
20 21 * * 1-5 bash ~/git_repo/cronjobs/$SCRIPT_NAME.sh 2&>1 | tee ~/git_repo/cronjobs/logs/$SCRIPT_NAME.log

my_cool_script.sh

#!/usr/bin/env bash
~/anaconda3/envs/Django/bin/python ~/git_repo/Django_project/manage.py run_command

Это хорошо работает для меня, когда переменные среды должны храниться в секрете, а загрузка существующего .bashrc по какой-либо причине не играет «хорошо».

1
Scott Skiles

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

* * * * * 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
1
Kirill Bulygin

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

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.shset_env_to_process.sh устанавливает правильный env для запуска скрипта

Может использоваться как командная строка, cron, sudo, ssh для настройки env

 * * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py
0
Gang