我试图跟随本指南将 Node 应用程序作为服务运行。但是,它无法启动,退出代码为 127。有什么方法可以解决这个问题吗?
这是日记。
sudo journalctl --follow -u serviceName
-- Logs begin at Tue 2017-08-08 16:27:10 GMT. --
Aug 08 17:06:57 raspberrypi systemd[1]: Started serviceName.
Aug 08 17:06:57 raspberrypi app.js[7234]: [46B blob data]
Aug 08 17:06:57 raspberrypi systemd[1]: serviceName.service: main process exited, code=exited, status=127/n/a
Aug 08 17:06:57 raspberrypi systemd[1]: Unit serviceName.service entered failed state.
Aug 08 17:06:57 raspberrypi systemd[1]: serviceName.service holdoff time over, scheduling restart.
Aug 08 17:06:57 raspberrypi systemd[1]: Stopping serviceName...
Aug 08 17:06:57 raspberrypi systemd[1]: Starting serviceName...
Aug 08 17:06:57 raspberrypi systemd[1]: serviceName.service start request repeated too quickly, refusing to start.
Aug 08 17:06:57 raspberrypi systemd[1]: Failed to start serviceName.
Aug 08 17:06:57 raspberrypi systemd[1]: Unit serviceName.service entered failed state.
这是serviceName.service。
[Unit]
Description=ServiceName
After=network.target
[Service]
ExecStart=/home/pi/projects/ServiceName/app.js
Restart=always
User=root
Group=root
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/home/pi/projects/ServiceName
[Install]
WantedBy=multi-user.target
这是我的 app.js 的顶部。
#!/usr/bin/env node
答案1
ExecStart=/home/pi/projects/ServiceName/app.js
这是告诉直接systemd
运行app.js
。这个.js
文件可以直接执行吗?如果没有,shell 将抛出退出代码 127 - “未知命令”。
答案2
127 是未找到命令。
确保 root 用户有权访问节点二进制文件,否则将以下行更改为已为其安装节点的用户
User=root
Group=root
否则尝试以下
[Unit]
Description="ServiceName"
After=network.target
[Service]
ExecStart=path_to_node/node /home/pi/projects/ServiceName/app.js
Restart=always
# Restart service after 10 seconds if node service crashes
RestartSec=10
# Output to syslog
StandardOutput=syslog
StandardError=syslog
#Change this to find app logs in /var/log/syslog
SyslogIdentifier=nodejs-api
# Followig will require if you are using the PORT or Node from Envirnoment
Environment=NODE_ENV=production PORT=3000
[Install]
WantedBy=multi-user.target
一旦您的服务器计算机启动并且您无法访问服务器,您可以通过以下命令检查 /var/log/syslog 中的日志来进行故障排除
sudo grep "nodejs-api" /var/log/syslog
开机启动:sudo systemctl 启用火箭
答案3
要调试,只需运行此命令(用 systemd 单元文件中的值替换 <> 部分:
sudo runuser -l <User> -g <Group> -c "cd <WorkingDirectory> && <PATH> <ExecStart>"
问题是给定的User
无法访问您设置的ExecStart
内容。PATH
如果有人仍然遇到困难,我已经写了一份分步指南:调试系统
答案4
嘿,对于感兴趣的人,我遇到了这个问题,并尝试了一切,但最终从 Node 6 升级到 Node 12 解决了这个问题。