Node.js脚本使用systemctl启动失败

8
我需要使用systemctl从远程机器自动运行我的node.js脚本。
我已经创建了一个.service文件,并将其放置在/etc/systemd/system/路径下。以下是.service文件的内容:
[Unit]
Description=laporan

[Service]
ExecStart=/var/www/laporan/nodeserver/server.js
Restart=always
User=nobody
Group=root
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/laporan/nodeserver

[Install]
WantedBy=multi-user.target

但是每次我尝试启动服务时,都会返回以下错误(systemctl status laporan的输出):

● laporan.service - laporan
   Loaded: loaded (/etc/systemd/system/laporan.service; enabled)
   Active: failed (Result: start-limit) since Mon 2016-09-12 09:15:06 WITA; 11min ago
  Process: 121690 ExecStart=/var/www/laporan/nodeserver/server.js (code=exited, status=203/EXEC)
 Main PID: 121690 (code=exited, status=203/EXEC)

Sep 12 09:15:05 kominfomdc systemd[1]: Unit laporan.service entered failed state.
Sep 12 09:15:06 kominfomdc systemd[1]: laporan.service start request repeated too quickly, refusing to start.
Sep 12 09:15:06 kominfomdc systemd[1]: Failed to start laporan.
Sep 12 09:15:06 kominfomdc systemd[1]: Unit laporan.service entered failed state.

这个错误具体是什么?我有什么遗漏吗?

2个回答

18

我认为这不是启动Node应用程序的方式。你只是在这里指定JavaScript文件:

ExecStart=/var/www/laporan/nodeserver/server.js
您还需要指定node可执行文件,例如以下内容,如果node在路径中。
ExecStart= node /var/www/laporan/nodeserver/server.js

如果节点不在可执行路径上,您必须提供它:

ExecStart=/usr/local/bin/node /var/www/laporan/nodeserver/server.js

收到这样的通知:可执行路径不是绝对路径。我的节点也在路径中。 - Edgar P.
好的,我将其更改为ExecStart=/usr/local/bin/node /var/www/laporan/nodeserver/server.js,它运行得非常好。感谢您的回答! - Edgar P.
2
请注意,在某些系统中,Node 位于 /usr/bin/node,因此请尝试运行完整路径(即 /usr/bin/node /dir/yourapp.js 或 /usr/local/bin/node /dir/yourapp.js)以查看哪个适用于您的系统。 - Youkko
谢谢,我遇到了一个有点奇怪的问题。Node已经在我的路径上(在我的EC2实例中),并且运行node absolute_path_to_index.js是正常的。然而,在systemd中执行完全相同的命令失败了,显然是因为systemd正在使用默认的Node安装(它显然是node 8)。所以我运行了which node并将绝对路径粘贴到systemd中,这就成功了。 - Christophe Vidal
如果我想要使用npm run start怎么办? - undefined

6

为了清楚显示出错误,你输入的node可执行文件路径是错误的。 要获取正确的路径,可以使用以下方法:

$ which node // /usr/bin/node

在我的情况下,路径不同,我得到的是 /usr/bin/node,因此在你的ExecStart中, 从命令行中复制node路径。

ExecStart=/usr/bin/node /var/www/laporan/nodeserver/server.js

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接