起動時にセッションを作成する PHP スクリプトを呼び出す systemd サービスがありますtmux
。
tmux
全体的には、ディストリビューションの最新版(V>=2.5)を使用しています。
スクリプトの は2.0USER
です。$HOME/bin/tmux
必要なのは、ユーザーの $HOME にあるバイナリsystemd
を使用することです。systemd サービス ファイルで USER および GROUP 変数を設定しましたが、グローバルにインストールされたバイナリが呼び出されるようです。tmux
このサービス呼び出しのために呼び出されるバイナリを明示的に設定することは可能ですか?
可能であれば、PHP ファイル自体にパスをハードコードするのは避けたいと思います。
どうもありがとう。
答え1
PATH
systemd サービスにハードコードすることもできます:
[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-file
PATH
/etc/environment
ここで、 のデフォルト値はuser_envfile
であり.pam_environment
、これは SSH や LightDM ログインなどの他のものの PAM 設定によっても読み取られます。これらのものに影響を与えたくない場合に備えて、ここでは別のファイルを使用しました。 を削除してuser_envfile=...
、デフォルトの を使用することもできます。を持つ の~/.pam_environment
既存の PAM 設定を使用することもできますが、他の PAM モジュールによって望ましくない副作用が発生する可能性があります。/etc/pam.d
user_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
ここで、サービスがアクセスできるようにするために必要な実行可能ファイルへのパスを追加すれば、問題はないはずです。私の場合はうまくいきました。