如何通过cron作业执行Node.js脚本?

Ste*_*eve 50 cron crontab node.js

很简单,我有一个节点脚本,我想每个月执行一次.

30 6 1 * * node /home/steve/example/script.js
Run Code Online (Sandbox Code Playgroud)

但这不起作用,大概是因为命令正在运行的路径或shell.我尝试了以下通过cron执行节点的方法(使用-v测试):

steve@atom:~$ node -v
v0.4.2

steve@atom:~$ sh node -v
sh: Can't open node

steve@atom:~$ bash node -v
/usr/local/bin/node: /usr/local/bin/node: cannot execute binary file

steve@atom:~$ /usr/local/bin/node -v
v0.4.2

steve@atom:~$ sh /usr/local/bin/node -v
/usr/local/bin/node: 1: Syntax error: "(" unexpected

steve@atom:~$ bash /usr/local/bin/node -v
/usr/local/bin/node: /usr/local/bin/node: cannot execute binary file
Run Code Online (Sandbox Code Playgroud)

我已经没有想法尝试,任何建议?

Dan*_* D. 91

只需提供/usr/local/bin/nodecron作业中节点的完整路径,如:

30 6 1 * * /usr/local/bin/node /home/steve/example/script.js
Run Code Online (Sandbox Code Playgroud)

  • 警告!如果您使用nvm或n来管理节点安装 - 放置`/ usr/local/bin/node` - 可能无效!为了获得节点的实际路径,使用`which node` - 然后将该路径放在脚本之前.EG我从nvm使用节点0.10.32,所以我的节点路径是:`/ home/username/.nvm/v0.10.32/bin/node` (15认同)
  • 事实证明,这是两个问题,如您所说的完整路径固定了cron,但是脚本中的相对路径也是一个问题。 (2认同)

Mau*_*ord 26

另外,只需将#!/usr/local/bin/node脚本放在要执行的脚本的顶部即可.然后它会自动知道用节点执行脚本.确保该文件也是可执行的.

  • `#!/ usr/bin/env node`是未来的证据,因为`env`将指向你的`node`安装的地方. (20认同)

zab*_*usa 6

在使用Linux Mint的笔记本电脑中,给定的路径不起作用,所以我用它来解决。

$ which node

$ /usr/bin/node 这对我有用。


imb*_*olc 6

您还可以在用户 crontab 之上指定二进制文件的路径,例如:

PATH=/bin:/usr/bin:/usr/local/bin

* * * * * cd your/path && node foo.js
* * * * * cd your/path && npm run bar
Run Code Online (Sandbox Code Playgroud)


小智 6

这也适用于用户级 cron 作业

 */2 * * * * cd /home/destination/path && $(which node) index.js
Run Code Online (Sandbox Code Playgroud)


小智 5

这些答案在这里说使用绝对路径都会对运行较大的节点应用程序造成重大问题!

真正的完整解决方案

编辑Cron工作

crontab -e
Run Code Online (Sandbox Code Playgroud)

查找节点路径

which node
Run Code Online (Sandbox Code Playgroud)

将CD放入目标文件夹,然后根据节点路径更改Cron Job并运行脚本

*/2 * * * * cd /home/destination/path && /bin/node index.js
Run Code Online (Sandbox Code Playgroud)

然后,这将允许您运行完整的NodeJS应用程序,而不会出现所有错误,例如如何为index.js文件使用绝对路径。