Использование systemd для запуска airflow внутри среды conda

Использование systemd для запуска airflow внутри среды 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, чтобы среда conda, в которой фактически установлен 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)?
  • Если это бессмысленно, есть ли лучший способ запустить 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

Связанный контент