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/

ExecStartairflowアクティブ化するには、Airflow が実際にインストールされている conda 環境が必要です。これを行うには、 に示す 2 つのコマンドを追加しましたExecStartPre。2 番目のコマンドは実際にこの環境をアクティブ化します。これを単独で実行すると が返される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 を実行するより良い方法はありますか? 私は特にsystemd が提供するenableおよびオプションに興味がありました。restart

答え1

今では問題が解決されていることを願っていますが、参考までに私の解決策をここに示します。

私がこれを解決した方法は、エアフローを起動するための間接レベルを追加することでした。airflow_runner.sh次のようなbashスクリプトがあります。

conda activate airflow-env
$AIRFLOW_BIN/airflow $@

次にsystemdユニットファイルで

ExecStart=PATH_TO_SCRIPT/airflow_runner.sh webserver --pid /run/airflow/webserver.pid

関連情報