Переменные среды, когда python script выполняется cron
Я рассматривал другие вопросы, но не мог заставить их работать. У меня есть python script, который использует переменные среды. Этот script работает точно так же, как и планировалось при запуске напрямую, но я хотел бы запускать его как задание cron каждую минуту.
В настоящее время в моем каталоге cron.d у меня есть файл под названием scrapers, содержащий:
* * * * * root /usr/bin/python3.5 /code/scraper.py
Запускает python script, но script терпит неудачу, как в script Я использую две переменные среды.
Я читал, что должен добавить 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?
Ответы
Ответ 1
Вместо выполнения всего ~/.profile
то, что я сделал бы, это переместить переменные, которые должны быть разделены между вашими заданиями cron
и учетной записью с профилем, тогда я бы разместил их как в ~/.profile
, так и в задании cron.
Последняя попытка, которую вы показываете в вопросе, не отформатирована должным образом. Идентификатор пользователя должен поступать сразу после информации о планировании, но вы добавили источник профиля до идентификатора пользователя, который, безусловно, не может работать.
Вот пример, который я тестировал здесь:
*/1 * * * * someuser . /tmp/t10/setenv && /usr/bin/python /tmp/t10/test.py
Я установил его для выполнения каждую минуту для тестирования. Замените someuser
тем, что имеет смысл. Я использовал /tmp/t10/setenv
script:
export FOO=foovalue
export BAR=barvalue
В файле /tmp/t10/test.py
было следующее:
import os
print os.environ["FOO"], os.environ["BAR"]
Мой cron отправляет мне по электронной почте вывод скриптов, которые он запускает. Я получил электронное письмо с этим выходом:
foovalue barvalue
Ответ 2
Вы можете установить переменную env inline:
* * * * * root ENV_VAR=VALUE /usr/bin/python3.5 /code/scraper.py
Другим способом является использование honcho, что вы можете передать файл с переменными env.
honcho -e /path/to/.env run /code/scraper.py
Ответ 3
Вы можете указать две переменные среды следующим образом:
* * * * * 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
Ответ 4
Это один из подход, который мне нравится, напишите script, чтобы установить среду и выполнить script с ее параметрами в качестве параметров
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
установить правильное env для script для запуска
Его можно использовать в качестве командной строки, cron, sudo, ssh для установки env
* * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py