2012-05-04 99 views
3

如何在rake task內啓動線程,然後在任務完成時終止線程。Rake任務用於在獨立線程中運行服務器,然後在任務完成時終止線程?

本質上,我正在寫一個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任務的問題。

回答

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有一個命令行選項,在前臺運行,這將是更好地使用,否則,如果它自身daemonizes你需要知道在哪裏存儲其PID文件,以便識別和殺死守護進程。

相關問題