如何在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任务。
答案 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文件的位置,以便识别和杀死守护进程。