【问题标题】:Why won't cron execute my node.js script?为什么 cron 不执行我的 node.js 脚本?
【发布时间】:2014-12-06 14:46:57
【问题描述】:

我希望我的服务器每分钟执行一次节点脚本。如果我手动执行文件(./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 并没有接受它。

【问题讨论】:

  • 可能会检查文件的执行权限。
  • 之前这把我搞砸了,但我已经解决了。不过还是谢谢。
  • 相对路径名 : var v = require('./cli/validation'); 您的 cron 作业未在 /home/bryce/scripts/wudu/ 目录中启动,但从 cron 调用时 pwd 很可能是 /home/bryce/。
  • @wildplasser 是的,我就是这么想的。我决定尝试使用 crontab 执行一个 shell 脚本(位于 wudu),然后执行 ./main.js 文件。但这也行不通。我还尝试全局安装模块(npm install -g)并从 shell 脚本执行全局模块,但我遇到了同样的问题。如何确保相对路径指向正确的文件?
  • 通常,您会将其包装到 shellscript 中。 shellscript 在调用实际有效负载之前设置一些环境( PATH ...)变量并更改工作目录。将set >>/tmp/mylog.log放入shellscript进行验证。

标签: node.js cron


【解决方案1】:

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

尝试在 cron 中使用设置 NODE_PATH 和 PATH 来执行 shell 脚本
(如果您需要这些值,请在命令行输入:echo $NODE_PATH 和 echo $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 命令中获得的值。

【讨论】:

  • 小评论:如果你有很多这样的脚本,你不应该为每个脚本添加环境变量,只需在 crontab 文件的开头添加一次,它会适用于所有脚本。跨度>
【解决方案2】:

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

##!/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>

【讨论】:

  • 我做 source ~/.bash_profile 而不是 . ~/.bash_profile?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 2013-09-13
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多