我使用 systemd 在虚拟机上运行 Next.js 前端。我制作 systemd 服务的工作流程通常是:
ec2-user
)但是,由于
$PATH
的差异,该服务并未按预期运行。
确实,
.bash_profile
和.bashrc
包含扩展$PATH
的代码。此配置已通过 pyenv 等工具自动完成。
所以我最终制作了一个丑陋的单元文件来匹配我在用户 shell 中的相同
$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
有更干净的方法来解决这个问题吗?
您似乎希望您的 systemd 服务具有与打开终端时相同的环境。您可以使用 PAM(可插入身份验证模块)加载用户环境来实现此目的。 只需将
PAMName=login
添加到您的 .service
文件即可。像这样:
[Service]
PAMName=login
Type=simple
ExecStart=/path/to/your/command
这将启用您的 systemd 使用 PAM 登录模块加载环境。