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



如何在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的方法,但请发表评论,因为这个问题专门询问线程和耙子任务。

你想要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文件的位置,以便识别和杀死守护程序。