Обработка ввода и вывода демона - PullRequest
4 голосов
/ 16 июля 2011

Я хочу создать демон программы ruby ​​в Linux.

Я также хочу, чтобы демон был интерактивным - я хочу иметь возможность отправлять входные данные демону через файл / pipe / самый простойметод и получить вывод в файл.

Как мне это сделать?

Я изучил демоны модуля (потоки http://daemons.rubyforge.org/), и метод popen3, но мне трудно заставить их выполнитьвыше.

ОТВЕТ: Метод Младена:

У меня есть контроллер, который создает демона: (вам понадобится гем модуля демонов)

require 'rubygems'
require 'daemons'

Daemons.run('/myDaemon.rb', {:app_name => "o", :dir_mode => :normal, :dir => '', :log_output => true, :multiple => true })

Вот myDaemon.rb:

puts `pwd`

File.open('my_pipe', 'r+') do |f|
    loop do
            line = f.gets
            puts "Got: #{line}"
    end
end

Шаги: Оба файла находятся в моем корневом каталоге \. Daemons.run создает демон в \.

  1. Создайте именованный канал, mkfifo./my_pipe.

  2. ruby ​​controller.rb start

  3. cat> my_pipe

  4. введите текст

  5. ctrl-c для остановки ввода

  6. cat o.output, чтобы увидеть ваш вывод

Ответы [ 2 ]

4 голосов
/ 16 июля 2011

Пожалуй, самый простой способ именованных каналов, основанный на http://www.pauldix.net/2009/07/using-named-pipes-in-ruby-for-interprocess-communication.html:

Шаг 1: Создать именованный канал

mkfifo ./my_pipe

Шаг 2: Создайте своего "демона":

File.open('my_pipe', 'r+') do |f|
  loop do
    line = f.gets
    puts "Got: #{line}"
  end
end

и запустите его.

Шаг 3: Откройте другой терминал и запустите

cat > my_pipe

и начните набирать текст построчно.

Шаг4: Наблюдать за выходом демона.

Шаг 5: ???

Шаг 6: Прибыль.

2 голосов
/ 16 июля 2011

Откройте сокет , связанный с портом, который не используется, но который известен вам и программам, которые хотят с ним связаться.Если демону нужно общаться только с процессами на одном компьютере, используйте сокет домена Unix (см. Socket.unix_server_loop).Если ему также необходимо взаимодействовать с процессами вне хоста, на котором он запущен, вам нужно открыть интернет-сокет (см. Socket.tcp_server_loop).

Общий рецепт для сервера:

  • Открыть сокет
  • Привязать к IP-адресу хоста и выбранному порту (tcp) или привязать к пути в системе (unix)
  • Подождите (выбрать)для чего-то подключиться
  • Принять соединение
  • Ввести цикл чтения / записи

На клиенте:

  • Открыть сокет
  • Подключение к адресу / порту сервера или подключение к пути доменного сокета Unix, который использует сервер
  • После подключения введите коммуникационный цикл записи / чтения.

Ваш сервер и клиент (ы) должны договориться о том, кто отправляет то, что первым, и каковы соответствующие ответы другой стороны.

...