Использование systemd для запуска воздушного потока в среде conda
Я настроил сервер Airflow, установленный в среде conda, для запуска некоторых запланированных автоматизаций. В настоящее время я запускаю планировщик, рабочих и веб-сервер напрямую, используя nohup
, но я бы хотел использовать systemd для более надежного управления.
Однако у меня возникают проблемы при запуске системы с systemctl start
, Я добавил к своему .service
подать следующее:
ExecStartPre=. /etc/profile ; /home/shared/miniconda2/bin/conda activate airflow
ExecStart=/home/shared/miniconda2/envs/airflow/bin/airflow webserver --pid /run/airflow/webserver.pid
(где shared/
это не пользователь, просто папка внутри /home/
к которому имеют доступ все пользователи)
ExecStart
требует airflow
Конда окружение, в котором воздушный поток фактически установлен для активации. Для этого я добавил две команды ExecStartPre
Второй действительно активирует эту среду. Запуск этого одного возвращает CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
поэтому я добавил первый, чтобы обеспечить /etc/profile.d/conda.sh
загружен.
Однако, это все еще терпит неудачу, по-видимому, пытаясь запустить Сервер Gunicorn:
Running the Gunicorn Server with:
Workers: 4 sync
Host: 0.0.0.0:8080
Timeout: 120
Logfiles: - -
=================================================================
Traceback (most recent call last):
File "/home/shared/miniconda2/envs/airflow/bin/airflow", line 28, in <module>
args.func(args)
File "/home/shared/miniconda2/envs/airflow/lib/python2.7/site-packages/airflow/bin/cli.py", line 844, in webserver
gunicorn_master_proc = subprocess.Popen(run_args)
File "/home/shared/miniconda2/envs/airflow/lib/python2.7/subprocess.py", line 390, in __init__
errread, errwrite)
File "/home/shared/miniconda2/envs/airflow/lib/python2.7/subprocess.py", line 1025, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
(временные метки опущены, чтобы немного улучшить читаемость)
Это поднимает ряд вопросов:
- Что может вызвать сбой моего сервиса?
- Является ли моя настройка бессмысленной (systemd + conda + airflow)?
- Если это бессмысленно, есть ли лучший способ обеспечить более надежную работу воздушного потока, чем запускать его напрямую? Я был особенно заинтересован в
enable
а такжеrestart
опции, которые предлагает systemd.
1 ответ
Я надеюсь, что к настоящему времени вы решили свою проблему, но для справки вот мое решение.
Я решил, что нужно добавить уровень косвенности для запуска воздушного потока. У меня есть скрипт bash, например airflow_runner.sh
со следующим
conda activate airflow-env
$AIRFLOW_BIN/airflow $@
Тогда в моем файле модуля systemd
ExecStart=PATH_TO_SCRIPT/airflow_runner.sh webserver --pid /run/airflow/webserver.pid