使用 systemd 在 conda 环境中运行 airflow

使用 systemd 在 conda 环境中运行 airflow

我配置了安装在 conda 环境中的 Airflow 服务器来运行一些计划的自动化。目前,我直接使用 启动调度程序、工作程序和 Web 服务器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激活实际安装了 airflow 的 conda 环境。为此,我添加了 中看到的两个命令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)?
  • 如果这是无意义的,那么有没有比直接启动更好的方法来更稳健地运行气流?我对systemd 提供的enable和选项特别感兴趣。restart

答案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

相关内容