更好的方法来管理rake任务之间的状态(按进程id启动和停止服务器)

时间:2017-08-11 14:25:16

标签: ruby process rakefile

我需要在rake任务中启动和停止服务器。每个服务器都获得特定的进程ID。我已经创建了许多启动和停止每个服务器的任务(请注意,服务器可能并不总是唯一的,并且将在不同的端口上启动,因此我按照名称grep /搜索进程并杀死它们是不合理的)。我没有成功地以编程方式维护任务之间的状态(通过环境变量,类方法,实例方法,本地或全局变量)。对我(至少在我当前的设置中)也不可能使用rake任务依赖,例如:

Rakefile.rb

class Proc
    attr_accessor :process_id

    def start_server(port=4444)
        @process_id = spawn("node application -p #{port}", :chdir => "server_path")
    end
end

@proc = Proc.new

task :start_server_one do |t, args|
    @proc.start_server()
    p @proc.process_id
end

task :stop_server_one => :start_server_one do
    begin
        Process.kill(9, @proc.process_id)
    rescue => e
        p e
    end
end

在命令行上,我希望能够在任何给定时间运行任务,因此我不希望执行一个任务来阻止任何其他任务(因此我选择了生成进程的原因)。不幸的是,这种方法不起作用。

如果在任务之间管理状态没有运气,我的最终解决方案是使用yaml文件序列化进程id并在我成功终止进程后立即从文件中删除它们,类似于以下内容:

初始yaml_file.yml内容:

---
server_one_process_id: 
server_two_process_id:
server_three_process_id:

Rakefile内容:

require 'yaml'
yaml_file_path = 'yaml_file_path.yml'
all_yaml_contents = YAML::load_file(yaml_file_path)

class Proc
    attr_accessor :process_id

    def start_server(port=4444)
        @process_id = spawn("node application -p #{port}", :chdir => "server_path")
    end
end

@proc = Proc.new

task :start_server_one do |t, args|
    @proc.start_server()
    p 'server started!'
    all_yaml_contents['server_one_process_id'] = @proc.process_id
    File.open(yaml_file_path, 'w') {|f| f.write all_yaml_contents.to_yaml}
    p @proc.process_id
end

task :stop_server_one do
    all_yaml_contents_updated = YAML::load_file(yaml_file_path)
    p "server process id: #{all_yaml_contents_updated['server_one_process_id']}"
    Process.kill(9, all_yaml_contents_updated['server_one_process_id'])
    all_yaml_contents_updated['server_one_process_id'] = nil
    File.open(yaml_file_path, 'w') {|f| f.write all_yaml_contents_updated.to_yaml}
    sleep 5
    p 'server killed!'
end

现在我可以独立运行任务,例如在我可以运行的命令行上运行:

rake start_server_one
    #=> 'server started!'
    #=> 12892

rake stop_server_one
    #=> server process id: 12892
    #=> server killed!

并确保任务执行,服务器启动和停止,因为yaml文件现在使用给定服务器的进程ID进行更新。

然而,至少对我而言,似乎这不是最好的方法,我真的想要一种在任务之间管理状态的纯编程方式;甚至是一个合适的图书馆,可以帮助我实现这一目标。

0 个答案:

没有答案