使用 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