为什么cron不会执行我的node.js脚本?

时间:2014-10-11 15:29:42

标签: node.js cron

我希望我的服务器每分钟执行一次节点脚本。如果我手动执行文件(./main.js),程序会完美执行,所以我很确定它不是问题所在。但当我把它交给cron执行时,没有任何反应。

这里是来自cron文件的行。

*/1 * * * * /home/bryce/scripts/wudu/main.js

这是一个示例日志:

Oct 11 15:21:01 server CROND[2564]: (root) CMD (/home/bryce/scripts/wudu/main.js)

可执行文件:home/bryce/scripts/wudu/main.js

#!/usr/bin/env node

var program = require('commander');
var v = require('./cli/validation');
var a = require('./cli/actions');

program
  .version('0.0.1')
  .option('-u, --url', 'Register url')
  .option('-s, --selector', 'Register selector')
  .option('-p, --pagination', 'Register pagination')
  .option('-i, --index', 'Pass an index, to destroy')
  .parse(process.argv);

var args = process.argv.slice(2),
        mode = v.mode(args[0]),
        options = v.hasArgs(mode, program);

a.init(mode, options);

我知道为什么我会收音机保持沉默?我应该在其他地方调试?

更新:

我认为问题与我的相对文件路径有关,而main.js是从它自己的目录之外执行的。

现在,我已将exe.sh放在wudu目录中。它看起来像这样:

#!/bin/bash

cd ${0%/*}
./main.js mail

exit

现在,我已经设置了cron来每分钟执行一次这个文件。我尝试从其他文件夹执行此文件,它按预期工作。但是,再一次,cron并没有把它捡起来。

2 个答案:

答案 0 :(得分:10)

将执行包装在shell脚本中,可能是cron中脚本的执行与从命令行运行时的环境设置不同。

尝试在cron中执行shell脚本,并设置NODE_PATH& PATH
(如果需要这些值,请在命令行上键入:echo $NODE_PATHecho $PATH

所以,你的cron条目看起来像:

*/1 * * * * NODE_PATH=/usr/local/lib/node_modules PATH=/opt/local/bin:ABC:XYZ /home/bryce/scripts/wudu/exe.sh

请务必替换NODE_PATH&的实际值。 PATH使用您最初执行的echo命令获得的内容。

答案 1 :(得分:1)

我遇到了完全相同的问题,所以我结束了创建一个加载我的环境变量的直通脚本,然后像这样执行节点:

##!/bin/bash

# Source bash profile to load env variables
# or any other that you want to set explicitly
. ~/.bash_profile

# tunnel that allows us to execute cron jobs
node $1 $2

使用只需将其添加到您的crontab

* * * * * <user> <passthrough_script> <arg1> <arg2>