如何通过 cron 作业执行 Node.js 脚本?
Posted
技术标签:
【中文标题】如何通过 cron 作业执行 Node.js 脚本?【英文标题】:How can you execute a Node.js script via a cron job? 【发布时间】:2011-08-16 12:05:58 【问题描述】:很简单,我想每月执行一次节点脚本。
30 6 1 * * node /home/steve/example/script.js
但这不起作用,可能是因为路径或命令正在运行的外壳。我尝试了以下通过 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
我已经没有什么想法可以尝试了,有什么建议吗?
【问题讨论】:
阅读此github.com/wahengchang/nodejs-cron-job-must-know('nodejs-cron-job-must-know' 部分)。需要使用cd
命令导航到脚本所在的目录。我可能尝试了所有方法,但只有在此之后它才开始起作用。
【参考方案1】:
只需在您的 cron 作业中提供节点 /usr/local/bin/node
的完整路径,例如:
30 6 1 * * /usr/local/bin/node /home/steve/example/script.js
【讨论】:
原来是几个问题,你说的完整路径修复了 cron,但脚本中的相对路径也是一个问题。 @Steve 你是如何解决相对路径问题的? @Steve 我正在使用配置模块(例如 require('config').DB),当通过 crontab 运行时,不会填充配置变量。 警告!如果您使用 nvm 或 n 来管理您的节点安装 - 输入/usr/local/bin/node
- 可能无法正常工作!为了获得节点的实际路径,请使用which node
- 然后将该路径放在脚本之前。例如。我正在使用来自 nvm 的节点 0.10.32,所以我的节点路径是:/home/username/.nvm/v0.10.32/bin/node
@YemSalat 最好以节点版本独立的方式声明:# doc 需要为 cronjob 启用 node/nvm () # doc cron 默认使用短 PATH = /usr/bin :/bin 并且不执行 /root/.bashrc(等于 /root/.bashrc)# doc nvm(节点版本管理器)不会在 crontab 作业中配置自己(这只对我的 /root/ 中的交互式 shell 进行配置) .bashrc)。导出 NVM_DIR="/root/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && 。 "$NVM_DIR/nvm.sh" # 这会加载 nvm【参考方案2】:
这里的这些答案说使用绝对路径都会导致运行更大的节点应用程序出现重大问题!
真正的完整解决方案
编辑 Cron 作业
crontab -e
查找节点路径
which node
将CD放入目标文件夹,然后根据节点路径更改Cron Job并运行脚本
*/2 * * * * cd /home/destination/path && /bin/node index.js
这将允许您运行完整的 NodeJS 应用程序,而不会出现所有错误,例如如何为 index.js 文件使用绝对路径。
【讨论】:
感谢您的正确答案,我尝试了投票最多的解决方案但我的脚本不起作用,然后我尝试了其他解决方案,lig node-cron,但您的解决方案有效,简单易懂! 这对我来说也是完美的答案,谢谢! 这个其实也适合我。谢谢大佬。 这应该被标记为答案。谢谢老哥! 这可要了我的命。谢谢!也给后人留个言。对我来说,困惑是 Ubuntu 上的 Cron 以 root 身份运行,即使您没有这样编辑它。确保您的路径绝对来自根目录,而不仅仅是来自您的个人资料。【参考方案3】:此外,只需将#!/usr/local/bin/node
放在您要执行的脚本的顶部即可。然后它会自动知道用 node.js 执行脚本。确保文件也是可执行的。
【讨论】:
#!/usr/bin/env node
是未来的证明,因为env
将指向您的node
的安装位置。【参考方案4】:
您还可以在用户 crontab 顶部指定二进制文件的路径,例如:
PATH=/bin:/usr/bin:/usr/local/bin
* * * * * cd your/path && node foo.js
* * * * * cd your/path && npm run bar
【讨论】:
完美!这就是我想要的!【参考方案5】:在我使用 Linux mint 的笔记本电脑中,给定的路径不起作用,所以我用它来解决问题。
$ which node
$ /usr/bin/node
这对我有用。
【讨论】:
【参考方案6】:我不知道将脚本中的相对路径更改为绝对路径是否是个好主意 (当您的文件系统发生变化或您在另一个环境中部署时会发生什么?)
您可以尝试将其包装在 shell 脚本中,在 crontab 执行中设置一些环境变量。 (特别是 PATH
和 NODE_PATH
对于初学者)
试试我对这个类似问题的建议:https://***.com/a/27823675/608269
【讨论】:
【参考方案7】:对节点别名和要运行的文件使用绝对路径。
编辑 Cron 作业
crontab -e
运行我们的节点文件的入口
这将每分钟运行一次。
*/1 * * * * * /bin/node /public/test.js
完整教程 https://askmacgyver.com/blog/tutorial/how-to-run-node-scripts-from-a-cron-job
【讨论】:
【参考方案8】:如果您想保留 nvm
功能并允许您的代码获得更新的节点版本而不需要更改 cron 作业信息,请将您的作业放在首先设置 nvm
的 shell 脚本中,切换到正确的node
版本,然后运行实际作业。这是一个名为 invoicing
的项目的示例,该项目在其 package.json
中包含一个 cron
脚本。
文件invoicing.sh
:
#!/bin/bash
cd /home/produser/invoicing
export NVM_DIR="/home/produser/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
npm run cron
然后将其设置为您的 cron 作业列表中的命令:
0 16 1 * * produser /home/produser/invoicing/invoicing.sh
现在,如果您更改项目中的节点版本并使用正确的版本号更新您的 .nvmrc
并将新代码拉到服务器上,下次运行 cron 作业时,它将使用指定的节点版本运行。请注意,您还必须确保服务器具有所需的节点版本。
【讨论】:
以上是关于如何通过 cron 作业执行 Node.js 脚本?的主要内容,如果未能解决你的问题,请参考以下文章
运行 cron 作业 (Node.js) 时如何在 Amazon Elastic Beanstalk 中设置环境变量?
你怎么得到运行Node.js脚本的cron作业从.env文件中读取变量?