使用Ruby执行任意系统调用

时间:2015-01-28 23:41:02

标签: ruby puppet system-calls return-code

这个问题是在devops部门实习:

  

“编写执行任意系统调用的ruby库(例如:”dmesg“,”ping -c 1 www.google.com“)并提供stderr和stdout的分离输出流,并提供最终返回码过程。用单元测试展示你的工作。“

我是否应该使用已经建立的系统调用并在Ruby代码中复制它们?这对我来说似乎很愚蠢。我是否应该提出自己的任意调用并编写一个包含错误和状态调用的库?

我不是在找人写这个。我觉得解决这个问题的第一步就是理解它。

2 个答案:

答案 0 :(得分:0)

幸运的是,Ruby可以很容易地与底层操作系统进行交互。

您可以先阅读这些方法的文档:

此外,还有stdlib的Open3模块。

答案 1 :(得分:0)

从源头获取澄清

作业措辞不力,滥用了一些条款。另外,我们只能猜出他们真正的期望;适当的做法是直接向公司要求澄清。

重新实施Open3

话虽如此,他们可能想要的是一种处理任何给定命令及其参数作为装饰方法的方法,类似于标准库中Open3#capture3的工作方式。这意味着您编写的代码应该将命令和任何参数作为参数。

例如,使用标准库中的Open3#capture3

require 'open3'

def command_wrapper cmd, *args
  stdout_str, stderr_str, status = Open3.capture3 "#{cmd} #{args.join ' '}"
end

command_wrapper "/bin/echo", "-n", "foo", "bar", "baz"
#=> ["foo bar baz", "", #<Process::Status: pid 31661 exit 0>]

我真诚地怀疑重新实现这个库是有用的,但这看起来肯定是他们要求你做的。耸肩。

您还应该为重新实现编写单元测试,因此您必须使用内置框架(如Test :: Unit或MiniTest)或外部测试框架(如RSpec或错误)来解决问题。 。有关可用单元测试框架的更全面列表,请参阅Ruby Toolbox