2011-07-16 42 views
4

我想在Linux上創建一個Ruby程序的守護進程。處理守護進程的輸入和輸出

我也希望守護進程是交互式的 - 我希望能夠通過文件/管道/最簡單的方法將輸入發送到守護進程,並接收輸出到文件。

我該如何去做這件事?

我已經看過模塊守護進程(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. 紅寶石controller.rb開始

  3. 貓> my_pipe

  4. 類型的文本

  5. CTRL-C停止輸入

  6. 貓o.output看到你的輸出

回答

4

也許最簡單的方法,命名管道,基於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步:利潤。

+0

非常感謝!我花了好幾天的時間來解決這個問題! <3 –

2

打開綁定到未使用的端口的socket,但您知道的端口以及要與之通信的程序。如果守護進程只需要與同一臺機器上的進程進行通信,則使用Unix域套接字(請參閱Socket.unix_server_loop)。如果它還需要與正在運行的主機之外的進程進行通信,那麼您將需要打開Internet套接字(請參閱Socket.tcp_server_loop)。

服務器的通用配方是:

  • 打開綁定到的路徑的系統上(UNIX)的插座
  • 綁定到主機的IP地址和所選擇的端口(TCP),或
  • 等待(選擇)的東西連接
  • 接受連接
  • 回車讀/寫通訊循環

在客戶端:

  • 打開套接字
  • 連接到服務器的地址/端口,或連接到Unix域套接字的路徑服務器使用
  • 一旦連接,輸入寫/讀通信循環。

您的服務器和客戶端需要同意誰先發送什麼,以及另一方是否做出了相應的響應。