Ruby 来自Rake的长时间运行的shell命令是否可以正常中断?

Ruby 来自Rake的长时间运行的shell命令是否可以正常中断?,ruby,rake,Ruby,Rake,在几个项目中,我希望有一个rake任务,比如rake服务器,它将开始通过应用程序需要的任何方式为该应用程序提供服务。这里有一个例子: task :server do %x{bundle exec rackup -p 1234} end 这是可行的,但当我准备停止它时,按Ctrl+c并不能正常关闭;它会中断Rake任务本身,这表示Rake已中止并给出堆栈跟踪。在某些情况下,我必须执行两次Ctrl+c 我可能可以用Signal.trap编写一些东西,这样可以更优雅地打断这个过程。有没有更简单的

在几个项目中,我希望有一个rake任务,比如
rake服务器
,它将开始通过应用程序需要的任何方式为该应用程序提供服务。这里有一个例子:

task :server do
  %x{bundle exec rackup -p 1234}
end
这是可行的,但当我准备停止它时,按
Ctrl+c
并不能正常关闭;它会中断Rake任务本身,这表示
Rake已中止并给出堆栈跟踪。在某些情况下,我必须执行两次
Ctrl+c

我可能可以用
Signal.trap
编写一些东西,这样可以更优雅地打断这个过程。有没有更简单的方法

trap('SIGINT') { puts "Your message"; exit }
这应该是个好办法

您甚至可以在任务级别添加
陷阱

task :server do
  trap('SIGINT') { puts "Your message"; exit }
  %x{bundle exec rackup -p 1234}
end

又好又简单!虽然,为了优雅地结束,使用
exit
而不发出砰的一声似乎不是更好吗?@NathanLong取决于你对“优雅”的定义。对于人眼来说是一样的:PWith
exit“未运行任何退出处理程序。”因此将忽略退出do的任何
。我想我还是让它们跑吧。无论如何,非常感谢@NathanLong是的,这就是区别,肉眼看不见:P让我更新响应以符合您的要求。我可以停止控制器的指定任务吗?不确定它是否适用于您的情况,但我刚刚遇到了一个类似的rake任务问题,问题是在内部,我捕获了特定代码块中的任何类型的异常。似乎我也在吞咽Ctrl+C。当我开始捕捉StandardError时,Ctrl+C就开始工作了。