在远程服务器上执行rake任务

生产环境的物理体系结构包括多个执行不同作业的机器(rake任务),所有这些机器都在同一个数据库中。

其中一个作业会对表执行大量UPDATE ,如果其他作业正在运行,通常会返回postgres死锁。

我已经有一个rake任务来优雅地停止其他作业,但我只能从本地机器上执行它。

我想要实现的是:

 task :big_update => :environment do stop_tasks_on_another_servers # do the SQL UPDATE ... end 

stop_tasks_on_another_servers应该在其他服务器上执行rake task

我最好的尝试是使用https://github.com/capistrano/sshkit gem。 与Capistrano使用它相同,但我仍然在这里错过了一步。 我在生产机器的rails控制台上尝试以下操作:

 require 'sshkit/dsl' hosts = ['machine1', 'machine2'] on hosts do within "/home/me/project/current" do with rails_env: :production do rake "stop_tasks" end end end 

但它返回:

 INFO [70a0610a] Running /usr/bin/env rake stop_tasks on machine1 SSHKit::Command::Failed: rake stdout: Nothing written 

我缺少什么或者有更简单的方法来执行远程任务?

查看Rake Remote Task 。 这是一个片段,向您展示它是如何工作的:

 require 'rake/remote_task' set :domain, 'abc.example.com' remote_task :foo do run "ls" end 
Interesting Posts