【问题标题】:Kill process launched via thread杀死通过线程启动的进程
【发布时间】:2015-08-01 04:58:56
【问题描述】:

我有一个使用套接字进行通信的无头应用程序。启动时,它会一直保持活动状态,直到发送一条消息告诉它退出(或者它崩溃,或者被杀死)。

当使用 Ruby 对该应用程序进行单元测试时,我需要启动进程,与它进行交互(通过套接字),然后终止它。

我认为我可以使用这种模式来做到这一点:

class TestServer < MiniTest::Unit::TestCase
  def setup
    @thread = Thread.new{ `#{MY_COMMAND}` }
  end

  def test_aaa
    # my test code
  end

  def teardown
    @thread.kill if @thread
  end
end

但是,teardown 代码会杀死线程,但不会杀死它启动的进程。

我如何以以下方式启动该流程:

  1. 允许它在后台运行(立即将控制权返回给我的 Ruby 测试工具)
  2. 如果需要,允许我稍后强制终止进程。

我碰巧在 OS X 上进行开发,但如果可能的话,我希望有一个通用的解决方案,它适用于所有运行 Ruby 的操作系统。

【问题讨论】:

    标签: ruby multithreading unit-testing process


    【解决方案1】:

    您可以使用Process.spawn 代替线程和反引号:

    class TestServer < MiniTest::Unit::TestCase
      def setup
        @pid = spawn "#{MY_COMMAND}"
      end
    
      def test_aaa
        # my test code
      end
    
      def teardown
        Process.kill('TERM', @pid) if @pid
      end
    end
    

    【讨论】:

    • 谢谢!当您回答时,我发现another answer 建议@pid = Process.fork{ exec "my_command" }。你能评论一下这两者之间的功能差异(如果有的话)吗?
    • 没关系,我也是found that answer。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多