【问题标题】:Setting Connection to "close" in Sinatra在 Sinatra 中将连接设置为“关闭”
【发布时间】:2015-12-05 22:10:09
【问题描述】:

我有这个简单的 sinatra 网络应用程序:

require 'sinatra'

get '/' do
    "Success."
end

get '/app' do
    "done"
    response["Connection"] = "Close"
    `sudo pkill blink` 
    `gpio write 0 0` 
    `sudo ./blink #{params["func"]}`
end

./blink 是一个永远运行并且不会终止的程序,所以当我在浏览器中访问http://127.0.0.1/app?func=2 时,我只是得到一个加载循环,结果没有显示"done",但是我的程序试图在/app 块中运行。

我认为也许将 Connection 标头设置为 Close 可以解决问题,但是使用上面的代码(我认为可以设置标头)仍然将 Connection 标头设置为 Keep-Alive

有什么帮助吗?谢谢!

【问题讨论】:

  • 似乎“完成”应该放在do ... end 块的末尾,在所有其他东西之后,所以块应该返回这个值。 HTTP 标头 Connection=close 远远不够。
  • @andrykonchin 我试过了,直到我关闭服务器后它才显示“完成”,这也关闭了./blink,所以我仍然得到很长的加载循环跨度>
  • 。你确定你所有的shell命令都快速完成并且不延迟响应吗?您可以添加某种日志记录以查看所有行都已执行还是某些行未执行?
  • @andrykonchin 就像我说的,sudo ./blink #{params["func"]} 行正在执行一个永远运行的程序,它不会完成/返回
  • 哦,当然,我明白了。您是否尝试过使用& 命令(如sudo ./blink #{params["func"]} &)从shell 进程中分离?

标签: ruby http sinatra


【解决方案1】:

参考这个 SO 问题 Spawn a background process in Ruby 并在 @andrykonchin 的帮助下,我能够使用以下方法解决我的问题:

pid = fork do
        `sudo ./blink #{params["func"]}`
    end
Process.detach(pid)

【讨论】:

  • 我要补充一点,除非您想在每次命中该路由时都生成一个新进程,否则您应该考虑编写一个文件(或其他内容)来表明该进程已经在运行,或者允许您检查,然后将路由动词从 GET 更改为 PUT 或 POST 以指示幂等性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2014-06-28
  • 1970-01-01
相关资源
最近更新 更多