私は仮想マシンでNext.jsフロントエンドを実行するためにsystemdを使用しています。システム化されたサービスを作成するための私のワークフローは通常次のとおりです。
- ユーザーシェルでアプリケーションを実行するように設定する(
ec2-user
この場合) - 同じタスクを実行し、同じユーザーを使用するユニットファイルを作成します。
しかし$PATH
。
実際には拡張コードが含まれてい.bash_profile
ます。この構成は、次のツールによってすでに自動的に行われています。.bashrc
$PATH
ピエンブ。
$PATH
だから私はユーザーシェルにあるのと同じファイルと一致する見苦しいユニットファイルを作成しました。
[Unit]
Description=Web App Frontend
After=network.target
[Service]
User=ec2-user
Group=ec2-user
Environment="PATH=/home/ec2-user/.pyenv/shims:/home/ec2-user/.pyenv/bin:/home/ec2-user/.nvm/versions/node/v20.11.0/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin"
WorkingDirectory=/home/ec2-user/web-app-frontend
ExecStart=/home/ec2-user/.nvm/versions/node/v20.11.0/bin/yarn start
[Install]
WantedBy=multi-user.target
この問題を解決するためのよりきれいな方法はありますか?
答え1
回答プロバイダ:SOのユーザーSienna Dragon。以下に回答をコピーしました。
systemdサービスが端末を開いたときと同じ環境を持つことを望むようです。 PAM(Pluggable Authentication Module)を使用してユーザーエクスペリエンスをロードすると、これを実現できます。ファイルPAMName=login
に追加するだけです.service
。このように:
[Service]
PAMName=login
Type=simple
ExecStart=/path/to/your/command
これにより、systemdはPAMログインモジュールを使用して環境をロードします。