Cron 作业无法正确启动 nodejs



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

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)

问题出在PATH上。

对我来说,我使用的是serveStatic,并提供到像./public这样的静态文件夹的路径。这是一条错误的道路。通过提供完整的URL,我能够解决这个问题。

您也可以用其他解决方案解决同样的问题,关键是由于PATH的原因,您的代码无法解析为写入文件。

在cron启动的作业中获得的环境与在交互式shell中获得的不同。通常情况下,PATH远没有交互式shell中那么复杂。最简单的解决方法是显式设置完整路径。

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

sudo是一个允许您作为另一个用户运行命令的命令,它不会像在交互式shell中那样在cron中设置PATH值。

最新更新