Ruby on rails 在不打开浏览器的情况下运行ruby on rails函数

Ruby on rails 在不打开浏览器的情况下运行ruby on rails函数,ruby-on-rails,Ruby On Rails,你好 我需要构建一个RubyonRails应用程序,该应用程序将每隔1秒调用一个远程Api url,以便捕获应该在该远程web服务器中发生的事件 网址是 “remoteservername.com/folder/folder/waitforevents” 一旦发生想要的事件,我需要执行一些操作并再次调用“remoteservername.com/folder/folder/waitforevents”url。 这应该是一个连续的任务,不需要打开浏览器即可完成。这意味着该应用程序应在我的web服务

你好
我需要构建一个RubyonRails应用程序,该应用程序将每隔1秒调用一个远程Api url,以便捕获应该在该远程web服务器中发生的事件 网址是

“remoteservername.com/folder/folder/waitforevents”

一旦发生想要的事件,我需要执行一些操作并再次调用“remoteservername.com/folder/folder/waitforevents”url。
这应该是一个连续的任务,不需要打开浏览器即可完成。这意味着该应用程序应在我的web服务器启动后立即开始运行。

所以我的问题是,如何在不打开浏览器的情况下运行RubyonRails应用程序 只有服务器

到目前为止,我有编写rails应用程序的经验,这些应用程序是从打开浏览器并调用某个url时开始的。 因此,如果你能在这个问题上指导我,我将非常高兴


谢谢

您可以将
cron
/script/rails runner
一起使用,它可以从rails应用程序执行任何方法

因为您需要每秒执行一些操作,所以可以启动
运行程序一次,然后创建一个循环。您可以从cron启动它,将PID保存在某个地方,然后要求cron终止给定的进程,或者您可以在循环中的Ruby代码中超时。一个简单的例子:

class MyModelOrAnything
  def self.start_loop
    stop_fname = "./stop_the_loop"
    while !File.exist? stop_fname 
      do_this_action
      sleep 1
    end
  ensure
    File.unlink stop_fname  if File.exist? stop_fname
  end
end
cron任务可能会在已知目录中创建一个文件“stop\u the\u loop”,一秒钟后任务就会停止

事实上,在这种情况下可能不需要cron。因为您应该只有这个脚本的一个实例,所以最好手动启动它,然后手动停止它。如果您想使用cron,可以添加一个类似信号量的文件,该文件将告诉脚本一个进程已经在运行(该文件应该由'sure'块删除)

cron配置的一个示例:

0 8  * * 1 cd /my/app && bundle exec ./script/rails runner ThisObject.start_loop
0 22 * * 5 touch /my/app/stop_the_loop
…还有一个“信号量”的例子:

class MyModelOrAnything
  def self.start_loop
    running_fname = "./i_am_working"
    return :already_running if File.exist? running_fname
    stop_fname = "./stop_the_loop"
    begin
      File.open(running_fname,'w') {|f| f.write Time.now.to_s(:db) }
      while !File.exist? stop_fname 
        do_this_action
        sleep 1
      end
    ensure
      File.unlink running_fname if File.exist? running_fname
      File.unlink stop_fname  if File.exist? stop_fname
    end
  end
end

你确定你需要rails来开发这种应用程序吗?我建议您尝试使用原始ruby代码来完成这项工作,这样更易于维护。正如其他人所说,您可以使用cron定期启动应用程序。

一个好方法是使用延迟作业:

有一个关于该主题的railscast,它可能有助于:


我想你在找一份cron工作。看看宝石。Railscasts中提供的教程。为了侦听api远程服务器事件,我需要调用以侦听api远程服务器事件,我需要每隔1秒调用一次“remoteservername.com/folder/folder/waitforevents”url,从开始到结束,最小cron作业间隔为1分钟。那么,是否可以使用某种循环从我的应用程序执行url CONTIONS调用,并要求cron作业只执行该功能而不设置时间间隔?我的意思是,我可以告诉corn作业在预定义的时间内开始某项任务,并在预定义的时间内结束它。例如,现在开始作业,三天后结束作业?我可以在不打开浏览器的情况下运行延迟作业吗?