エアフロースケジューラサービス

エアフロースケジューラサービス

起動時にセッションを作成する PHP スクリプトを呼び出す systemd サービスがありますtmux

tmux全体的には、ディストリビューションの最新版(V>=2.5)を使用しています。
スクリプトの は2.0USERです。$HOME/bin/tmux

必要なのは、ユーザーの $HOME にあるバイナリsystemdを使用することです。systemd サービス ファイルで USER および GROUP 変数を設定しましたが、グローバルにインストールされたバイナリが呼び出されるようです。tmux

このサービス呼び出しのために呼び出されるバイナリを明示的に設定することは可能ですか?

可能であれば、PHP ファイル自体にパスをハードコードするのは避けたいと思います。

どうもありがとう。

答え1

PATHsystemd サービスにハードコードすることもできます:

[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

より柔軟なのは PAM です。 を単純に使用するのに比べると非常に回りくどいですbash -c '....'が、PAM を使用すればこれが可能です。

/etc/pam.d(たとえば/etc/pam.d/foo)に新しい PAM 設定を作成し、以下を追加します。

session    required     pam_env.so user_envfile=some-file user_readenv=1

そして/home/someUser/some-file、 に以下を追加します。

PATH DEFAULT=/home/someUser/bin:${PATH}

もちろん、some-file名前をより分かりやすいものに調整することもできますが、パスはユーザーのホーム ディレクトリ (サービスでuser_envfile設定したユーザー) を基準にする必要があります。User=

次に、サービス ファイルの セクションで、[Service](fooは前に作成したファイル/etc/pam.d) を追加します。

PAMName=foo

これで、サービスを開始すると(リロード後など)、sessionモジュールが/etc/pam.d/foo実行されます。この場合は、pam_envは、の制約に従ってpam_envから環境変数をロードし、次に からユーザー環境をロードします。 は でデフォルト値に設定されているため、ユーザー環境がこのデフォルト値の前に付加されます。/etc/environment/etc/security/pam_env.conf~/some-filePATH/etc/environment

ここで、 のデフォルト値はuser_envfileであり.pam_environment、これは SSH や LightDM ログインなどの他のものの PAM 設定によっても読み取られます。これらのものに影響を与えたくない場合に備えて、ここでは別のファイルを使用しました。 を削除してuser_envfile=...、デフォルトの を使用することもできます。を持つ の~/.pam_environment既存の PAM 設定を使用することもできますが、他の PAM モジュールによって望ましくない副作用が発生する可能性があります。/etc/pam.duser_readenv=1

答え2

ひどくハックっぽいですが、$PATH更新を先頭に追加することは機能するようです。
ただし、副作用には注意しています...

例:

ExecStart=/bin/bash -c "PATH=/home/someUser/bin:$PATH exec /usr/bin/php /some/path/to/a/script.php"

答え3

少し古い投稿を掘り出していることは承知していますが、私も、サーバーの実行時にスケジューラが自動的に実行されるように、PATH/環境変数を構成する方法を見つけようとしていました。

Ubuntu 18.04と18.10で動作する解決策を見つけました

私は、AirflowとPostgreSQLをインストールするリンクのバックエンドでここ

**記事の後半部分から 基本的には、airflow-scheduler.system ファイルに特定の変更を加えることになります。

これは、Ubuntu での実装における「落とし穴」の 1 つです。Airflow を作成した開発チームは、これを Linux の別のディストリビューションで実行するように設計したため、サーバーがオンのときに Airflow が自動的に実行されるように、小さな (しかし重要な) 変更を加える必要があります。デフォルトの systemd サービス ファイルは、最初は次のようになります。

[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

ただし、Ubuntu 18 では 'EnvironmentFile' プロトコルが動作しないため、これは機能しません。代わりに、その行をコメント アウトして、以下を追加します。

Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

少なくとも Airflow Scheduler 用に systemd サービス ファイルを作成し、UI も自動的に起動したい場合は Web サーバー用に systemd サービス ファイルを作成する必要があります。実際、この実装では両方が必要なので、airflow-scheduler.service と airflow-webserver.service の 2 つのファイルを作成します。どちらも /etc/systemd/system フォルダーにコピーされます。内容は次のとおりです。


エアフロースケジューラサービス

[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
#airflow-webserver.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]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow webserver -p 8085 --pid /home/ubuntu/airflow/airflow-webserver.pid
Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target

最後に、スーパーユーザーのコピー コマンド sudo cp を使用して、両方のファイルを /etc/systemd/systemd フォルダーにコピーしたら、イグニッション キーを押します。

sudo systemctl で airflow-scheduler を有効にし、sudo systemctl で airflow-scheduler を起動します。sudo systemctl で airflow-webserver を有効にし、sudo systemctl で airflow-webserver を起動します。

答え4

私が設定していたサービス (Apache Airflow) には、環境ファイルが設定されていました。

私の/etc/systemd/system/airflowファイルには次の行がありました:

[Service]
EnvironmentFile=/etc/default/airflow

この環境ファイルを開いて、私の場合は必要な行を追加しました。

SCHEDULER_RUNS=5
PATH=/opt/anaconda3/bin:$PATH

ここで、サービスがアクセスできるようにするために必要な実行可能ファイルへのパスを追加すれば、問題はないはずです。私の場合はうまくいきました。

関連情報