Использование Ruby для выполнения произвольных системных вызовов

Эта проблема заключается в том, чтобы попасть на стажировку в отдел devops:

"Написать библиотеку ruby, которая выполняет произвольные системные вызовы (например," dmesg", "ping -c 1 www.google.com "), а также предоставляет отдельные выходные потоки stderr и stdout, а также предоставляет окончательный код возврата процесса. Покажите свою работу с юнит-тестами. "

Я должен использовать уже установленные системные вызовы и копировать их в код Ruby? Это кажется мне глупым. Я должен придумать свои собственные произвольные вызовы и написать библиотеку с ошибками и статусными вызовами?

Я не ищу кого-то, чтобы написать это для меня. Я чувствую, что первым шагом к решению этой проблемы является ее понимание.

2 ответа

Решение

Получить разъяснение от источника

Задание плохо сформулировано и неправильно использует ряд терминов. Кроме того, мы можем только догадываться, чего они на самом деле ожидают; уместно было бы обратиться к компании напрямую за разъяснениями.

Повторно внедрить 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>]

Я искренне сомневаюсь, что полезно повторно реализовать эту библиотеку, но это, безусловно, похоже на то, что они просят вас сделать. Shrug.

Вы также должны написать модульные тесты для повторной реализации, так что вам придется что-то менять с помощью встроенной инфраструктуры, такой как Test::Unit или MiniTest, или внешней среды тестирования, такой как RSpec или Wrong. Смотрите Ruby Toolbox для более полного списка доступных структур модульного тестирования.

К счастью для вас, Ruby позволяет очень легко взаимодействовать с базовой операционной системой.

Вы можете начать с чтения документации по этим методам:

Также есть модуль Open3 из stdlib.

Другие вопросы по тегам