处理守护进程的输入和输出

时间:2011-07-16 17:03:52

标签: ruby linux daemons

我想在Linux上创建一个ruby程序的守护进程。

我还希望守护进程是交互式的 - 我希望能够通过文件/管道/最简单的方法将输入发送到守护进程并接收输出到文件。

我该怎么做?

我已经查看了模块守护进程(http://daemons.rubyforge.org/),线程和方法popen3,但我很难让他们完成上述操作。

解答: Mladen的方法:

我有控制器创建守护进程:(你需要守护进程模块gem)

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 个答案:

答案 0 :(得分: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步:获利。

答案 1 :(得分:2)

打开一个绑定到未使用但未知的端口的socket,以及您想要与之通信的程序。如果守护进程只需要与同一台机器上的进程通信,那么使用Unix域套接字(参见Socket.unix_server_loop)。如果它还需要与正在运行的主机之外的进程通信,那么您将需要打开一个Internet套接字(请参阅Socket.tcp_server_loop)。

服务器的一般配方是:

  • 打开套接字
  • 绑定到主机的IP地址和选定的端口(tcp),或绑定到系统上的路径(unix)
  • 等待(选择)连接的内容
  • 接受连接
  • 输入读/写通信循环

在客户端:

  • 打开套接字
  • 连接到服务器的地址/端口,或连接到服务器正在使用的Unix域套接字的路径
  • 连接后,进入写/读通信循环。

您的服务器和客户需要就谁先发送内容以及另一方发出适当的响应达成一致。