Cron作业无法正确启动Node.js

时间:2018-11-18 20:50:30

标签: javascript node.js cron raspberry-pi

这有点奇怪,我不知道该怎么办。 我有一个小型节点express api,该API托管在运行raspbian的Raspberry Pi上。

js文件在cron作业中启动:

@reboot sudo /usr/bin/node /var/www/html/api/server.js &

API本身运行良好,我可以访问它,并且它可以毫无问题地返回我的请求。

但是当有人提出请求时,API也应该写入日志文件:

fs.appendFile("./ServerLog.log", "[" + dateTime + "]" + " [" + status + "] " + message + "\n", null, () => {
});

这不起作用。但是,当我终止通过cronjob启动的进程并手动启动它时,它将创建日志。

我尝试使用bash启动节点,即:

@reboot sudo bash -c "sudo  /usr/bin/node /var/www/html/api/server.js &"

但这并没有改变任何东西。我也将输出更改为只写“ TEST” ,但这也不起作用。我的js文件开头确实有一个shebang:#!/usr/bin/env node

这些是打印到系统日志的行:

Nov 18 20:20:05 raspberrypi cron[331]: (CRON) INFO (pidfile fd = 3)
Nov 18 20:20:05 raspberrypi cron[331]: (CRON) INFO (Running @reboot jobs)

在auth.log中:

Nov 18 20:20:05 raspberrypi systemd-logind[309]: New seat seat0.
Nov 18 20:20:05 raspberrypi CRON[343]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 18 20:20:05 raspberrypi CRON[343]: pam_unix(cron:session): session closed for user root
Nov 18 20:20:05 raspberrypi sudo:     root : TTY=unknown ; PWD=/root ; USER=root ; COMMAND=/usr/bin/node /var/www/html/api/server.js
Nov 18 20:20:05 raspberrypi sudo: pam_unix(sudo:session): session opened for user root by (uid=0)

2 个答案:

答案 0 :(得分:0)

在cron启动的作业中,您获得的环境与在交互式shell中获得的环境不同。通常,PATH到目前为止没有交互式shell中的复杂。解决此问题最简单的方法是显式设置完整路径。

#!/usr/bin/env node实际上使用环境来查找名为“ node”的可执行文件。最简单的方法是将其替换为指向节点的显式路径,例如#!/usr/local/bin/node或系统上任何安装的位置。要找到它的安装位置,请执行以下操作:在交互式外壳中使用which node

sudo是一个命令,可让您以其他用户身份运行命令,就像在交互式shell中一样,在cron中设置PATH值将无济于事。

答案 1 :(得分:0)

问题出在PATH。

对我来说,我正在使用serveStatic并提供了指向./public之类的静态文件夹的路径。这解决了错误的道路。通过提供完整的URL,我能够解决问题。

您也可以使用其他解决方案来解决相同的问题,关键是由于PATH,您的代码无法解析到写入文件中。