Rakefile - останавливать все задачи в многозадачном режиме
У меня есть приложение, работающее с Flask, и я использую Compass в качестве препроцессора css. Что означает, что мне нужно запустить Python-сервер и компас для разработки. Я сделал умный Rakefile для запуска всего одной команды и запуска всего в одном окне терминала.
Все работает, но проблема в том, когда я пытаюсь все остановить (с cmd + c
), это только убивает задачу компаса и сервер Flask продолжает работать. Как я могу убедиться, что все задачи остановлены? Или есть альтернатива для одновременного запуска нескольких задач без этой проблемы?
Вот мой rakefile, довольно простой:
# start compass
task :compass do
system "compass watch"
end
# start the flask server
task :python do
system "./server.py"
end
# open the browser once everything is ready
task :open do
`open "http://127.0.0.1:5000"`
end
# the command I run: `$ rake server`
multitask :server => ['compass', 'python', 'open']
РЕДАКТИРОВАТЬ
Для записи я использовал Makefile, и все работало идеально. Но я изменил часть своего рабочего процесса и начал использовать Rakefile, поэтому я все сделал Rakefile и избавился от Makefile для простоты.
1 ответ
Это потому system
создает новые процессы для ваших команд. Чтобы убедиться, что они убиты вместе с вашим процессом ruby, вам нужно убить их самостоятельно. Для этого вам нужно знать их идентификаторы процессов, которые system
не обеспечивает, но spawn
делает. Затем вы можете ждать, пока они завершатся, или убить подпроцессы, когда вы нажмете ^C.
Пример:
pids = []
task :foo do
pids << spawn("sleep 3; echo foo")
end
task :bar do
pids << spawn("sleep 3; echo bar")
end
desc "run"
multitask :run => [:foo, :bar] do
begin
puts "run"
pids.each { |pid| Process.waitpid(pid) }
rescue
pids.each { |pid| Process.kill("TERM", pid) }
exit
end
end
Если вы делаете rake run
при этом команды выполняются, но при прерывании задач отправляется сигнал TERM. Есть еще исключение, которое делает его на верхнем уровне, но я предполагаю, что для Rakefile, который не предназначен для публикации, это не имеет большого значения. Ожидание процессов необходимо, или процесс ruby завершится до того, как другие и pids будут потеряны (или должны быть выкопаны из ps
).