Ruby 通过线程启动的Kill进程

Ruby 通过线程启动的Kill进程,ruby,multithreading,unit-testing,process,Ruby,Multithreading,Unit Testing,Process,我有一个无头应用程序,它使用套接字进行通信。启动时,它将保持活动状态,直到发送消息通知它退出(或它崩溃或被杀死) 当使用Ruby对这个应用程序进行单元测试时,我需要启动这个进程,与之交互(通过套接字),然后杀死它 我想我可以用这个模式来做: class TestServer < MiniTest::Unit::TestCase def setup @thread = Thread.new{ `#{MY_COMMAND}` } end def test_aaa

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

当使用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
classtestserver
但是,该
teardown
代码会终止线程,但不会终止由其启动的进程

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

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

  • 我碰巧是在OSX上开发的,但如果可能的话,我希望有一个通用的解决方案可以在所有运行Ruby的操作系统上运行

    您可以使用
    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
    
    classtestserver
    谢谢!当你回答的时候,我发现这表明
    @pid=Process.fork{exec“my_command”}
    。你能评论一下这两者之间的功能差异(如果有的话)吗?没关系,我也是。:)