2011-07-16 44 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域套接字的路径服务器使用
  • 一旦连接,输入写/读通信循环。

您的服务器和客户端需要同意谁先发送什么,以及另一方是否做出了相应的响应。