我正在尝试在 Debian 9 中将 Node.js 应用程序作为服务运行。因此,按照一些教程,我制作了一个类似的服务。
[Unit]
Description=bumer API Http Server
[Service]
PIDFile=/tmp/bumer-service.pid
User=root
Group=root
Restart=always
KillSignal=SIGQUIT
WorkingDirectory=/root/bumer/
SyslogIdentifier=bumer
ExecStart=/root/bumer/app.js
[Install]
WantedBy=multi-user.target
我的应用程序有#!/usr/bin/env node
第一行,如果我运行命令,它运行得很好/root/bumer/app.js
。问题是当我启动服务时出现以下错误:
main process exited, code=exited, status=127/n/a
因此,我尝试将 app.js 文件的第一行更改为节点的路径,而不是单词“node” #!/usr/bin/env /usr/local/lib/nodejs/node-v8.11.4/bin/node
,现在它运行良好。我猜想该服务没有读取 PATH 变量,我需要一些帮助来了解为什么它没有读取。
(我的路径是正确的,当我运行“type node”时结果是好的)。
root@bumer:~# type node
node is /usr/local/lib/nodejs/node-v8.11.4/bin/node
(我正在记录我在 app.js 上的 ~/.bashrc 上设置的变量 PORT,但它也无法读取,它会记录undefined
)。
答案1
服务不在登录会话上下文中运行。
你的PATH
是不是PATH
是的,登录会话中 shell 中的值是完全不相关的,shell 的启动脚本也是如此。
服务管理系统(一般来说,不限于systemd)的特点之一是它们基于单个统一环境启动所有服务,如修改仅有的通过服务定义的元素(无论是什么)。这与登录 shell 如何为登录会话设置用户环境无关。 (不,它也不是root
的登录会话环境。)
在 systemd 的情况下,您的服务定义是服务单元文件,除非您PATH
在该单元中进行修改,否则它将是任何默认值所有服务都以。在 systemd 的例子中,这是有记录的;并且/usr/local/lib/nodejs/node-v8.11.4/bin/
是不是在名单上。
如果您想PATH
成为除所有服务默认值之外的其他内容,则需要使用Environment=
设置来修改您的服务单元以进行更改。
进一步阅读
- 伦纳特·珀特林等人。 (2017)。 ”生成的进程中的环境变量“。 系统执行程序。 systemd 手册页。 Freedesktop.org。