【问题标题】:Ruby on rails: How to run a background task automatically when the server starts?Ruby on rails:如何在服务器启动时自动运行后台任务?
【发布时间】:2023-04-12 04:25:01
【问题描述】:

我创建了一个运行后台进程的 Rails 应用程序。它定期 ping 服务器并显示响应时间的图表。为此,我使用了一个名为 crono 的 gem。我正在使用“bundle exec crono”从命令行启动任务。

如何在rails服务器启动时自动运行后台进程而无需从命令行启动它?

另外,有没有办法定期自动刷新页面以显示更新的图表?

编辑:此应用程序将部署到生产环境。
编辑:我仍然无法让它工作。这是文件夹结构:


应用程序/配置/
ping_job.rb
crontab.rb

crontab 使用 'crono' gem 每 5 秒执行一次 ping_job.rb 中的任务。

需要'typhoeus'
类 PingJob
def 执行

#task 定义在这里。

结束
结束

我想在服务器启动时自动运行 ping_job.rb 中定义的任务。我正在考虑使用宝石。欢迎提出任何建议。

【问题讨论】:

  • 要在系统启动时启动,请使用系统的标准工具。例如,在 ubuntu 上,它曾经是新贵。现在它是系统化的,我想。其他系统可以有其他工具。请查阅您拥有的工具的文档。

标签: ruby-on-rails ruby rubygems


【解决方案1】:

把它放在Rails.application.initialize!下面的config/environment.rb中,这是为了启动rails服务器,所以会在应用程序初始化后运行

【讨论】:

    【解决方案2】:

    前段时间我想和你一样加入一个后台进程的启动与铁路服务器的启动。最后我发现这是个坏主意。我认为最好的解决方案是创建一个部署任务,在每次部署时启动和重新启动进程。例如 capistrano 允许这样做:

    namespace :deploy do
      task :start do
        invoke 'my_process:start'
      end
    
      task :stop do
        invoke 'my_process:stop'
      end
    
      task :restart do
        invoke 'my_process:start'
        invoke 'my_process:stop'
      end
    end
    
    namespace :my_process
      task :start do
        execute "some system command to start the process"
      end
    
      task :stop do
        execute "some system command to stop the process"
      end
    end
    

    永远不要在 Rails 初始化文件中启动您的进程。当您的服务器上的应用程序工作人员很少时,它可能会多次启动该过程。或者它可能会在您启动 Rails 控制台等时启动该过程。

    【讨论】: