データパイプラインプロジェクトにエアフローを使用しています。プロジェクトをエアフローで構成し、次のコマンドを使用してバックエンドプロセスとしてエアフローサーバーを起動しました
aiflow webserver -p 8080 -D True
サーバーはバックエンドで正常に実行されています。次に、airflowで認証を有効にし、airflow.cfgで構成を変更したいのですが、認証機能がサーバーに反映されません。ローカルマシンでエアフローサーバーを停止および起動すると、機能します。
では、サーバーでデーモンエアフローWebサーバープロセスを再起動するにはどうすればよいですか。
Systemdを使用した自動回復により、堅牢な方法でエアフローを実行することをお勧めします
だからできること:
-開始するにはsystemctl start airflow
-systemctl stop airflow
を停止するには
-再起動するにはsystemctl restart airflow
このためには、systemd「ユニット」ファイルが必要です。 (実際の)例として、次を使用できます。put it in /lib/systemd/system/airflow.service
[Unit]
Description=Airflow webserver daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
PIDFile=/run/airflow/webserver.pid
EnvironmentFile=/home/airflow/airflow.env
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/bash -c 'export AIRFLOW_HOME=/home/airflow ; airflow webserver --pid /run/airflow/webserver.pid'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
RestartSec=42s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
追伸:AIRFLOW_HOMEを設定で気流フォルダーに変更します
WebサーバーデーモンのプロセスIDの$AIRFLOW_HOME/airflow-webserver.pid
を確認できますか?
次に、killシグナルを渡してそれを殺します
cat $AIRFLOW_HOME/airflow-webserver.pid | xargs kill -9
その後、ちょうど実行
airflow webserver -p 8080 -D True
デーモンを再起動するには
AirflowはHTTPサーバーであるため、 gunicorn を使用するため、標準のPOSIXスタイルの信号を送信できます。デーモンが再起動するために一般的に使用する信号は、HUP
です。
シグナルを送信する正しいプロセスIDを取得するには、エアフローWebサーバーデーモンのpidファイルを見つける必要があります。このファイルは、$AIRFLOW_HOME
または/var/run
にあります。これは、多くのPIDを見つける場所です。
Pidファイルが/var/run
にあると仮定すると、次のコマンドを実行できます。
cat /var/run/airflow-webserver.pid | xargs kill -HUP
gunicornはプリフォークモデルを使用するため、マスタープロセスとワーカープロセスがあります。 HUP
信号はマスタープロセスに送信され、マスタープロセスは次のアクションを実行します。
HUP:構成を再読み込みし、新しい構成で新しいワーカープロセスを開始し、古いワーカーを正常にシャットダウンします。アプリケーションがプリロードされていない場合(preload_appオプションを使用)、Gunicornは新しいバージョンもロードします。
gunicornシグナル処理ドキュメント の詳細情報。
これは主に、captaincapsaicinの回答の拡張バージョンですが、プロセスを強制終了して再起動する代わりに、HUP
(SIGKILL)ではなくKILL
(SIGHUP)を使用してプロセスをリロードします。
これは私のために働いた(複数回!:D)
プロセスIDを見つけます:(8080がポートであると仮定して)
lsof -i tcp:8080
それを殺します
kill <pid>
Initスクリプトを作成し、コマンド「daemon」を使用してこれをサービスとして実行します。
daemon --user="${USER}" --pidfile="${PID_FILE}" airflow webserver -p 8090 >> "${LOG_FILE}" 2>&1 &