这有点奇怪,我不知道该怎么办。 我有一个小型节点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)
答案 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,您的代码无法解析到写入文件中。