在Rails控制器和Rails控制台中执行命令时出现差异

时间:2016-04-19 06:54:47

标签: ruby-on-rails ruby shell

我正在尝试运行df命令来显示连接到我的服务器的磁盘的统计信息。但是,它始终将磁盘的大小返回为0.如果我在生产环境中的rails控制台中运行相同的命令,则返回磁盘的大小。

以下是我的代码的结构,

class Disk
  def self.metrics
    `df -h`
  end
end

这就是我在控制器中调用它的方式,

 class DiskController
   def metrics
     @metrics = Disk.metrics
   end
 end

但是当我试图在视图中看到结果时,它总是返回nil。但是,相同的命令在Rails控制台中有效。

我已尝试使用systemPOPEN,但所有内容都会返回相同的结果。

此外,同样的事情在开发(Mac OSX)中有效,但在生产中却没有(Linux Ubuntu)。

1 个答案:

答案 0 :(得分:1)

您的控制台在您已登录的用户下运行。您的Rails应用程序在用户下运行,专用于运行您的Web服务器。我相信在控制器代码中调用whoami将显示用户名。该用户可能被限制为运行df命令。虽然不建议这样做,但可能的解决方案是授予此用户执行df命令的权限(通过/etc/sudoers。)

但是,我会采用另一种方法。我将添加一个cron作业,它将代表任何允许的用户执行df -h并将输出放在项目树中的某个文本文件中。然后,控制器可能会读取此文件以显示磁盘使用信息。

我知道这些信息可能稍微过时,但由于每个人都可以执行cron工作,比如分钟,这应该是可以接受的。这种方法的优点是Web服务器仍然无法访问系统命令。

相关问题