ruby Rakefile -停止多任务中的每个任务

iyzzxitl  于 2023-03-01  发布在  Ruby
关注(0)|答案(1)|浏览(134)

我有一个运行在Flask上的应用程序,使用Compass作为css预处理器。这意味着我需要启动python服务器和compass进行开发。我做了一个我认为很聪明的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。

nnsrf1az

nnsrf1az1#

这是因为system为你的命令创建了新的进程。为了确保它们和你的ruby进程一起被杀死,你需要自己杀死它们。为此你需要知道它们的进程id,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进程将在其他进程和PID丢失之前完成(或者不得不从ps中挖出来)。

相关问题