【发布时间】: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 进程中分离?