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).

Другие вопросы по тегам