Rake在独立线程中运行服务器的任务,然后在任务完成时终止线程?

时间:2012-05-04 19:03:53

标签: ruby multithreading rakefile

如何在rake task内启动线程,然后在任务完成时终止。

基本上我正在写一个rake task来测试一个jekyll网站。我希望能够启动服务器,执行一些其他任务,然后在任务完成时销毁线程。以下是我到目前为止的情况:

task :test_site do
  `ejekyll --server`
  `git -Xdn`
  if agree( "Clean all ignored files?")
    git -Xdf
  end
end

但不幸的是,我知道停止jekyll --server的唯一方法是使用ctrl c。我很高兴听到一种方法可以阻止jekyll --server在一个没有退出rake任务的庄园中但请注释,因为问题是专门询问线程和rake任务。

1 个答案:

答案 0 :(得分:3)

您希望Process.spawn一个帖子。这是一个新流程,而不是现有流程中的执行线程。你得到了PID,所以只需发送Process.kill(:QUIT, pid)或你想用来杀死产生的处理的任何方法。

pid = Process.spawn(
  "ejekyll", "--server",
  out: "/dev/null",
  err: "/dev/null"
)

# you may need to add a short sleep() here

# other stuff

Process.kill(:QUIT, pid) && Process.wait

如果ejekyll有一个命令行选项在前台运行,那么最好使用它,否则如果它自我守护你需要知道它存储其PID文件的位置,以便识别和杀死守护进程。