我有一个运行在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。
1条答案
按热度按时间nnsrf1az1#
这是因为
system
为你的命令创建了新的进程。为了确保它们和你的ruby进程一起被杀死,你需要自己杀死它们。为此你需要知道它们的进程id,system
没有提供,但是spawn
提供了。然后你可以等待它们退出,或者在你点击^C时杀死子进程。举个例子:
如果你对它执行
rake run
,命令会被执行,但是当你中止的时候,任务会被发送一个TERM信号,仍然有一个异常,它会到达顶层,但我想对于一个不打算发布的Rakefile来说,这并不重要。等待进程是必要的,否则Ruby进程将在其他进程和PID丢失之前完成(或者不得不从ps
中挖出来)。