我使用 systemd 在虚拟机上运行 Next.js 前端。我制作 systemd 服务的工作流程通常是:
- 使应用程序从用户 shell 运行(
ec2-user
在本例中) - 编写一个执行相同操作并使用相同用户的单元文件
然而,由于$PATH
.
事实上,.bash_profile
并且.bashrc
包含扩展的代码$PATH
。此配置已由类似工具自动完成pyenv。
所以我最终制作了一个丑陋的单元文件来匹配$PATH
我在用户 shell 中的相同文件:
[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(可插入身份验证模块)加载用户环境来实现此目的。只需添加PAMName=login
到您的.service
文件中即可。像这样 :
[Service]
PAMName=login
Type=simple
ExecStart=/path/to/your/command
这将使您的 systemd 使用 PAM 登录模块加载环境。