Вопрос или проблема
Мне нужно запустить python-скрипт, используя определенную среду anaconda, так как мне нужно выполнять этот скрипт несколько раз в день, я бы хотел сделать это с помощью файла cron в linux (/etc/crontab).
Когда я запускаю скрипт из командной строки linux, он работает нормально:
~/anaconda2/envs/py36/bin/python ~/production/web_scraping.py
Я добавил процесс в файл crontab:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# м ч дн мс дн пользователь команда
57 08 * * * пользователь ~/anaconda2/envs/py36/bin/python ~/production/web_scraping.py | touch ~/test.txt
Строка корректно выполняется cron, вот журнал cron:
user@exmachina:~$ sudo cat /var/log/syslog | grep web_*
2 янв 08:57:02 localhost CRON[10854]: (пользователь) CMD (~/anaconda2/envs/py36/bin/python ~/web_scraping.py | touch ~/test.txt)
Я добавил | touch test.txt
к строке cron, чтобы убедиться, что строка выполняется, и файл test.txt создается.
Python-скрипт использует Selenium для извлечения данных с веб-страницы с помощью chrome webdriver. Могло ли это быть причиной того, что скрипт работает нормально из командной строки, но не из файла cron?
Спасибо за вашу помощь!
Вместо | touch ~/test.txt
было бы более информативно использовать | tee ~/test.txt
(или tee -a
).
Рассмотрите возможность включения env|sort; id; date
в вывод, который вы записываете.
Вы довольно слабо описали скрипт selenium и то, как он “не работает нормально” из cron. Успешно ли прошли все import
, или, возможно, PYTHONPATH неверен? Поможет ли запустить conda env update -f environment.yml
, а затем сделать так, чтобы cron job source activate xxx
, чтобы задача подтянула соответствующие версии библиотек?
Некоторые переменные, включая PATH и LD_LIBRARY_PATH, могут быть важны для вашего браузера, и, когда вы смотрите на зарегистрированные значения, вы можете увидеть, что они отличаются от интерактивной среды, где selenium работает нормально. Часть настройки задачи cron заключается в копировании аспектов среды, чтобы задача удалась.
Ответ или решение
Как запустить код Python из cron в окружении Anaconda
Запуск скрипта Python, использующего Selenium, из cron в окружении Anaconda может быть непростой задачей, так как cron работает в ограниченной среде и не всегда может получить доступ к необходимым системным переменным. В этом ответе мы детально рассмотрим, как корректно настроить cron для запуска вашего скрипта в Anaconda.
1. Проблема
Вы уже проверили, что ваш скрипт успешно выполняется из командной строки:
~/anaconda2/envs/py36/bin/python ~/production/web_scraping.py
Однако, при запуске через cron скрипт может не работать должным образом. Ваша запись в crontab выглядит следующим образом:
57 08 * * * user ~/anaconda2/envs/py36/bin/python ~/production/web_scraping.py | touch ~/test.txt
На первый взгляд, запись выглядит правильно, но следует учитывать несколько факторов, которые могут привести к неудачам.
2. Проблемы окружения
Cron выполняет задания в "чистом" окружении, которое отличается от вашего пользовательского окружения. Это означает, что некоторые переменные окружения (например, PATH
, LD_LIBRARY_PATH
и другие) могут быть установлены иначе. Чтобы диагностировать потенциальные проблемы, вы можете модифицировать вашу задачу cron, чтобы записывать значения переменных окружения:
57 08 * * * user env | sort > ~/cron_env.txt; id >> ~/cron_env.txt; date >> ~/cron_env.txt; ~/anaconda2/envs/py36/bin/python ~/production/web_scraping.py >> ~/test.txt 2>&1
Эта команда запишет значения окружения, идентификатор пользователя и текущую дату в cron_env.txt
. Также перенаправит ошибки и стандартный вывод скрипта в test.txt
.
3. Активация окружения Anaconda
Следует отметить, что для выполнения Python-скрипта из cron вам необходимо явно активировать окружение Anaconda. Вы можете использовать следующий подход:
57 08 * * * user bash -c "source ~/anaconda2/bin/activate py36 && python ~/production/web_scraping.py >> ~/test.txt 2>&1"
Здесь мы используем bash -c
для выполнения команд в оболочке, где мы сначала активируем окружение, а затем выполняем скрипт.
4. Путь к исполняемым файлам
Убедитесь, что все пути (например, к Chrome WebDriver) указаны правильно. Вам может понадобиться явно задать PATH
перед запуском вашего скрипта. Например:
export PATH=$PATH:~/anaconda2/envs/py36/bin:~/path/to/chromedriver
Обновленный cron-запись может выглядеть следующим образом:
57 08 * * * user bash -c "export PATH=$PATH:~/anaconda2/envs/py36/bin:~/path/to/chromedriver && source ~/anaconda2/bin/activate py36 && python ~/production/web_scraping.py >> ~/test.txt 2>&1"
5. Дебаггинг
Если ваш скрипт все еще не работает, убедитесь, что все библиотеки, используемые в вашем скрипте, установлены и доступны в текущем окружении. Попробуйте обновить ваше окружение:
conda env update -f environment.yml
Заключение
Запуск Python-скриптов из cron в окружении Anaconda требует учета различных элементов окружения и точной настройки команд. Следуя описанным шагам, вы сможете устранить возможные проблемы и успешно запустить ваш Selenium-скрипт по расписанию. Не забудьте про проверку логов, чтобы отслеживать возникающие ошибки и корректировать их в будущем.