2012-05-04 2 views
3

Как запустить поток в пределах rake task, а затем убить протектора, когда задача будет выполнена.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 в усадьбе, которая не выходит из задачи рейка, но, пожалуйста, просто прокомментируйте, поскольку в вопросе конкретно задаются вопросы о задачах по потоку и грабли.

ответ

3

Вы хотите Process.spawn, не a нить. Это новый процесс, а не поток выполнения в существующем процессе. Вы возвращаете 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-файл, в целях выявления и убить демона.

Смежные вопросы