node.js 应用程序从命令行运行,但在 ubuntu 14.04 LTS 上重新启动时从 cron 作业运行时出现错误

node.js 应用程序从命令行运行,但在 ubuntu 14.04 LTS 上重新启动时从 cron 作业运行时出现错误

使用 forever 手动启动我的应用程序时,它运行良好。它在 localhost:8080 上运行并nginx进行路由。

使用时,cronjob我的starter.sh脚本运行,但在永久日志中出现错误。如果我starter.sh从命令行运行脚本,我的应用程序也可以运行。只有从运行时才不起作用cronjob。以下是详细信息:

forever list 命令输出:

data:    [0] pQHz /root/.nvm/v0.10.26/bin/node server.js 953     1077 /root/.forever/pQHz.log 0:0:0:7.90 

starter.sh重启时运行的 bash 脚本:

#!/bin/sh

if [ $(ps -e -o uid,cmd | grep $UID | grep node | grep -v grep | wc -l | tr -s "\n") -eq 0 ]
then
        export PATH=/root/.nvm/v0.10.26/bin/:$PATH
        forever start --spinSleepTime 10000 --sourceDir /root/neet server.js  >> /root/cronlog.txt 2>&1
fi

crontab -e

@reboot sh /root/neet/starter.sh

starter.sh输出:

^[[33mwarn^[[39m:    --minUptime not set. Defaulting to: 1000ms
^[[32minfo^[[39m:    Forever processing file: ^[[90mserver.js^[[39m

永远的错误日志:

Error: ENOENT, no such file or directory './client/index.html'
    at Object.fs.openSync (fs.js:427:18)
    at Object.fs.readFileSync (fs.js:284:15)
    at self.populateCache (/root/neet/server.js:42:40)
    at self.initialize (/root/neet/server.js:174:14)
    at Object.<anonymous> (/root/neet/server.js:191:6)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
error: Forever detected script exited with code: 8
error: Script restart attempt #1

这是我的应用程序中错误引用的代码行:

self.zcache['index.html'] = fs.readFileSync('./client/index.html');

我真的很困惑为什么它只能在cronjob重启时读取文件。如果能得到帮助我将不胜感激。

答案1

当您从 cron 运行脚本时,您当前的工作目录将是调用该脚本的用户的主目录。因此,当您的脚本尝试查找相对路径 ./client/index.html 时,该文件不存在。

答案2

最好以与版本无关的方式进行配置(由于您使用 nvm,因此您可能安装了多个节点版本)。

这是 nvm-installer 添加到 /root/.bashrc 脚本的相同代码片段

@doc Required to enable node/nvm for a cronjob ()

@doc  cron uses by default a short PATH = /usr/bin:/bin and does not execute /root/.bashrc (equal to /root/.bashrc)

@doc  nvm (node version manager) does not configure itself in a crontab job (that is only done for interactive shells in my /root/.bashrc).

export NVM_DIR="/root/.nvm"  # or perhaps ~./nvm in your environment.
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

相关内容