Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么可以';我不能终止Sinatra服务器吗?_Ruby_Sinatra - Fatal编程技术网

Ruby 为什么可以';我不能终止Sinatra服务器吗?

Ruby 为什么可以';我不能终止Sinatra服务器吗?,ruby,sinatra,Ruby,Sinatra,为什么我不能使用以下命令停止Sinatra服务器: post '/terminate' do Thread.current.kill end 我在浏览器中键入: localhost:<port>/terminate localhost:/terminate 但它从不终止服务器,Sinatra说它不知道这样的路径。原因可能是什么?浏览器将执行“获取”http请求 如果你换成 get '/terminate' do exit # system exit! end 我认为它

为什么我不能使用以下命令停止Sinatra服务器:

post '/terminate' do
  Thread.current.kill
end
我在浏览器中键入:

localhost:<port>/terminate
localhost:/terminate

但它从不终止服务器,Sinatra说它不知道这样的路径。原因可能是什么?

浏览器将执行“获取”http请求

如果你换成

get '/terminate' do
  exit # system exit!
end

我认为它会工作。

浏览器将执行“获取”http请求

如果你换成

get '/terminate' do
  exit # system exit!
end

我认为它会起作用。

adzdavies部分正确,您没有点击路由,因为您的浏览器发出了
GET
请求,并且您定义了
post
路由,但是
exit
也不会起作用,它只会向您吐出一个错误。引发
中断
异常也是如此
Thread.current.kill
只是结束当前线程的执行,这似乎意味着杀死当前实例和服务器,它不会杀死服务器,服务器有自己的进程

require 'sinatra/base'

class SillyWaysToKillTheServer < Sinatra::Base

  enable :inline_templates

  get "/" do
    erb :index
  end

  get '/terminate' do
    exit # system exit!
  end

  get "/threadkill" do
    Thread.current.kill
  end

  get "/exception" do
    raise Interrupt, "Kill the server, please!"
  end

  run! if __FILE__ == $0
end

__END__

@@ layout
<html>
<body>
  <%= yield %>
</body>
</html>

@@ index

<p><a href="/terminate">terminate</a></p>
<p><a href="/threadkill">threadkill</a></p>
<p><a href="/exception">exception</a></p>
需要'sinatra/base'
类以任意方式关闭服务器

Sinatra是一个框架,而不是服务器。服务器有自己的进程,并运行一个小循环来启动新的线程或分支(Thin使用线程作为其模型,Unicorn使用预处理,例如),或者运行您提供的Sinatra代码的任何东西。要停止服务器,可以使用Ctrl+c来中断它,或者找到进程号并使用
kill
,或者像其他人一样发送SIGHUP。像这样停止Web服务器可能有一些很好的理由,但我想不出一个理由,可能不同的服务器对线程终止和退出的响应不同,但它们仍然不会停止您的服务器


随大流。

adzdavies部分正确,您没有点击路由,因为您的浏览器发出了
GET
请求,并且您定义了
post
路由,但是
exit
也不起作用,它只会向您吐出一个错误。引发
中断
异常也是如此
Thread.current.kill
只是结束当前线程的执行,这似乎意味着杀死当前实例和服务器,它不会杀死服务器,服务器有自己的进程

require 'sinatra/base'

class SillyWaysToKillTheServer < Sinatra::Base

  enable :inline_templates

  get "/" do
    erb :index
  end

  get '/terminate' do
    exit # system exit!
  end

  get "/threadkill" do
    Thread.current.kill
  end

  get "/exception" do
    raise Interrupt, "Kill the server, please!"
  end

  run! if __FILE__ == $0
end

__END__

@@ layout
<html>
<body>
  <%= yield %>
</body>
</html>

@@ index

<p><a href="/terminate">terminate</a></p>
<p><a href="/threadkill">threadkill</a></p>
<p><a href="/exception">exception</a></p>
需要'sinatra/base'
类以任意方式关闭服务器

Sinatra是一个框架,而不是服务器。服务器有自己的进程,并运行一个小循环来启动新的线程或分支(Thin使用线程作为其模型,Unicorn使用预处理,例如),或者运行您提供的Sinatra代码的任何东西。要停止服务器,可以使用Ctrl+c来中断它,或者找到进程号并使用
kill
,或者像其他人一样发送SIGHUP。像这样停止Web服务器可能有一些很好的理由,但我想不出一个理由,可能不同的服务器对线程终止和退出的响应不同,但它们仍然不会停止您的服务器

顺其自然