Sinatra在网页上打印字符串

时间:2014-02-05 20:58:08

标签: ruby-on-rails ruby sinatra

我正在尝试在网页上打印流程状态。但是当执行host:port/status方法时,我没有看到任何响应。它返回一个空白页面。 ps -ef命令在命令行上执行。我尝试在getStatus方法上打印它,但它不打印它。

我想在网站上显示流程执行状态。

def getStatus
        puts #{system('ps -ef | grep abc.jar|grep -v grep')? "Running": "Stopped"}
        return #{system('ps -ef | grep abc.jar|grep -v grep')? "Running": "Stopped"}
end

get '/status' do
     return getStatus
end

1 个答案:

答案 0 :(得分:2)

表达式

puts #{…

只会打印换行符,因为字符串外的#会引入注释,与return #…相同。

要获得实际输出,请使用类似的东西(我可以自由地将您的代码片段转换为更惯用的Ruby):

def running?
  `ps -ef` =~ /abc\.jar/
end

get '/status' do
  status = running? ? 'Running' : 'Stopped'
  logger.debug "Status: #{status}"
  status
end

现在running?方法执行检查:

  1. 通过Kernel#`
  2. 获取ps -ef的结果
  3. 通过regular expression将结果与String#=~ /abc\.jar/进行匹配(基本上在Ruby土地上执行grep abc\.jar
  4. 步骤1在子shell中执行,子shell中的所有内容都返回到Ruby域,而Kernel#system只返回命令是否以非零退出状态退出。从system('...')开始的命令的任何输出也会重定向到标准输出。您的初始代码段不会以这种方式工作,因为grep -v grep将始终以状态0退出。

    (从技术上讲,不需要子shell,但IO.popen调用更复杂)