基于文件更新在Rails中运行基于事件的Cron作业?

时间:2015-07-27 20:22:31

标签: ruby-on-rails ruby cron

我有一个rails应用程序,它作为后端API和Indexer,必须显示许多不同产品的最新信息。所以,这不是我的设计,我们可以从当前系统获取更新的唯一方法是随机接收大量XML文件,并在一天中的许多点,我需要抓取并放入我的数据库。

所以我的问题是双重问题,与我如何执行这样的工作有关。

首先,我查看了Ruby中的各种cron执行程序,并看到每当gem是基本预定cron任务的流行选择,但由于这不是预定的cron作业,我想知道我是如何提示这样的一个事件以及我可以使用哪些工具来实现这一目标。

其次,我想知道每当Rails应用程序中的目录更新时,是否可以从我的第一个问题触发cron作业? I.E.每当我在该目录中获得一个新的XML文件时,我都会执行我的脚本来将其刮除并将其放入数据库中。

谢谢!

1 个答案:

答案 0 :(得分:1)

首先 var self = this; var nameItem = document.createElement("li"); var dateItem = document.createElement("li"); nameNode = document.createTextNode("Name: " + session.name); dateNode = document.createTextNode("Date: " + session.date); nameItem.appendChild(nameNode); dateItem.appendChild(dateNode); var element = document.getElementById("sessionData"); element.appendChild(nameItem); element.appendChild(dateItem); session.actions.forEach(function(action, index) { console.log(action); var listItem = document.createElement("li"); var node = document.createTextNode(action.name); var nestedUl = document.createElement("ul"); var dataUl = document.createElement("ul"); var scriptUl = document.createElement("ul"); var versionUl = document.createElement("ul"); var scriptLi = nestedUl.appendChild(document.createElement("li")); var dataLi = nestedUl.appendChild(document.createElement("li")); var versionLi = nestedUl.appendChild(document.createElement("li")); var scriptInfo = scriptUl.appendChild(document.createElement("li")); var dataInfo = dataUl.appendChild(document.createElement("li")); var versionInfo = versionUl.appendChild(document.createElement("li")); scriptLi.appendChild(document.createTextNode(action.script)); dataLi.appendChild(document.createTextNode(action.data)); versionLi.appendChild(document.createTextNode(action.version)); scriptInfo.appendChild(document.createTextNode(action.scriptTxt)); dataInfo.appendChild(document.createTextNode(action.dataTxt)); versionInfo.appendChild(document.createTextNode(action.versionTxt)); scriptLi.appendChild(scriptUl); dataLi.appendChild(dataUl); versionLi.appendChild(versionUl); listItem.appendChild(node); listItem.appendChild(nestedUl); var element = document.getElementById("actionData"); element.appendChild(listItem); }); 是一个Unix实用程序,在您的系统上设置时,可以像您一样定期运行任务(称为" cron jobs") ;寻找。但是,由于它是一个Unix实用程序,并且无法连接到Rails或Ruby,因此需要直接在服务器上安装并在Rails应用程序之外进行配置。具体细节取决于您的服务器环境。

安装并运行cron后,如果您希望每小时在应用中执行一次命令,则需要在cron中添加一个条目(真实路径取决于您的安装方式)文件如:

/etc/crontab

现在,0 * * * * /home/yourapp/bin/rails runner -e production 'SomeCommand.run' gem可以帮助您自动生成您的cron文件,但除非您将whenever的输出复制到您的crontab,否则它实际上不会运行任何内容。有一些纯Ruby的cron替代品,比如rufus-scheduler,你可能更喜欢它们。你仍然需要让运行它的脚本是一个长时间运行的脚本,这需要一些服务器配置(最重要的是,如果它因任何原因而死,你会想要一个像这样的进程监视器god为您重新启动它。

第二次:是的,这是可能的! watching a directory in ruby为您提供了一些细节。您仍然需要设置一个长时间运行的脚本来监视该文件夹,并在添加文件时执行挂钩。