3

如何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 任务。

4

1 回答 1

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 文件的位置,以便识别和终止守护进程。

于 2012-05-05T01:33:09.883 回答