在rails功能上运行ruby而无需打开浏览器

时间:2011-05-30 10:44:08

标签: ruby-on-rails

您好
我需要在rails应用程序上构建一个ruby,它将每1秒调用一个远程Api url,以便捕获应该在该远程Web服务器中发生的事件 网址是

  

“remoteservername.com/folder/folder/waitforevents”

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

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

直到现在我都有编写rails应用程序的经验,这些应用程序是在浏览器打开并且调用了一些url时启动的。 如果你能指导我解决这个问题,我将很高兴

谢谢

3 个答案:

答案 0 :(得分:2)

您确定需要用于此类应用的导轨吗?我建议你尝试使用原始ruby代码完成工作,更容易维护。正如其他人已经说过的那样,您可以使用cron定期启动应用程序。

答案 1 :(得分:1)

您可以将cron./script/rails runner一起使用,runner可以执行rails应用程序中的任何方法。

由于您需要每秒执行一些操作,因此您可以启动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启动它,将PID保存到某个地方然后让cron杀死给定的进程,或者你可能只是在你的Ruby代码中,在循环中超时。一个简单的例子:

0 8  * * 1 cd /my/app && bundle exec ./script/rails runner ThisObject.start_loop
0 22 * * 5 touch /my/app/stop_the_loop

然后,cron任务可以在已知目录中创建文件“stop_the_loop”,并且您的任务将在一秒钟后停止。

事实上,在这种情况下可能没有必要使用cron。由于您应该只有此脚本的一个实例,因此最好手动启动它,并手动停止它。如果你想使用cron,你可以添加一个类似信号量的文件,它会告诉脚本一个进程已在运行(该文件应该被'ensure'块删除。)

cron config的一个例子:

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

..以及这个'信号量'的例子:

{{1}}

答案 2 :(得分:0)

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

https://github.com/collectiveidea/delayed_job

有关该主题的有关视频可能有所帮助:

http://railscasts.com/episodes/171-delayed-job