想法是这样的,写一个小脚本作为 xinetd 服务,通过 http 请求操作系统上的一些文件。通过 xinetd 可以把程序的本地 IO 变成网络 IO,xinetd 监听 tcp scoket 把接收的数据通过标准输入交给 Ruby 脚本,也会把 Ruby 脚本的输出发送给客户端。使用 xinetd 还有一个原因就是这个服务的使用频率不高,不用像独立服务那样一直在后台运行,消耗系统资源。基础代码如下:
require 'webrick'
req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)
req.parse(ARGF)
p req.header
p req.body
xinetd 新增一个服务:
service ftp-vum
{
disable = no
socket_type = stream
protocol = tcp
user = root
wait = no
server = /opt/script/ftp_vum.rb
log_type = SYSLOG daemon debug
}
监听的端口号在 /etc/services 中定义:
grep -E '\<8023/tcp\>' /etc/services \
|| echo 'ftp-vum 8023/tcp # comments' > /etc/services
上面的代码和配置已经可以工作了,但是细化的功能不知道怎么做了,比如 GET 获取一个文件内容,PUT 新建一个文件,DELETE 删除一个文件之类的,就是 Web 框架里的 Route,目前试过 Sinatra::Base - 中间件,程序库和模块化应用 ,跑起来还是一个独立服务,求指点: 从 STDIN 收到的 HTTP 请求怎么用路由?