刷新sinatra应用程序读取更新的文件

时间:2012-08-14 15:47:47

标签: ruby sinatra refresh readfile

我正在用红宝石编写一个sinatra应用程序,它将有关我的网络的信息收集到两个不同的文件中。第一个是.csv,它收集有关IP地址的信息以及网络中所有工作站的名称。第二个是.txt,读入Asterisk服务器并收集有关链接到指定IP地址的活动SIP通道的信息。

我的应用程序仅仅是编译来自这两个文件的信息,并在网页上创建匹配当前登录到特定工作站的用户的表格。但是,我希望该应用程序假装实时使用。我有两个文件每5分钟自动更新一次,但是当应用程序读取的文件被覆盖时,应用程序的输出不会改变。有没有办法对其进行操作,以便应用程序在编写后读取“新”文件?

我已经在堆栈溢出上进行了挖掘,并且我已经看到提及Kqueue的事情让python用户在重写之前只是观察这些文件中的更改,这将非常好。是否有红宝石版本?此外,我希望应用程序始终可以访问,并且可能只在需要更新某些内容时“刷新”,这样才有意义。

当我意识到在阅读之后我永远不会关闭我的文件时,我也发现了一个有趣的小顿悟。我不会发布整个应用程序,但这里是我阅读文件的地方:

#Pulls active SIP channels from Asterisk
$sip = {}
File.open('sip.txt').each do |line|
  userid,ip = line.split(" ")
  $sip[ip] = userid[0..3]
end

#Prepares hash of all stations, ip addresses
$machines = {}
CSV.foreach('/Volumes/Scripts/report-51.csv') do |row|
  name = row[1]
  address = row[0]
  $machines[name] = address
end

是否有可能因为我从不关闭文件,程序永远不会打开“新”文件?只是想在这里集体讨论。

1 个答案:

答案 0 :(得分:0)

很难说出发生了什么的整体结构,但是,无论每隔5分钟调用一次代码,然后又进行文件读取,我会确保文件已关闭并在该代码中重新打开每次通话。这应该可以解决你的问题。

您也可以考虑切换到数据库方法以获得更强大的结果。