服务不在登录会话上下文中运行。

服务不在登录会话上下文中运行。

我正在尝试在 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=设置来修改您的服务单元以进行更改。

进一步阅读

相关内容