4

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

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

我该怎么做呢?

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

答案:姆拉登的方法:

我有创建守护进程的控制器:(你需要守护进程模块 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. 红宝石控制器.rb 开始

  3. 猫 > my_pipe

  4. 输入文字

  5. ctrl-c 停止输入

  6. cat o.output 查看你的输出

4

2 回答 2

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

并运行它。

第三步:打开另一个终端并运行

cat > my_pipe

并开始逐行输入一些文本。

第 4 步:观察守护程序的输出。

第五步:???

第 6 步:利润。

于 2011-07-16T18:13:34.140 回答
2

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

服务器的一般配方是:

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

在客户端:

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

您的服务器和客户端需要就谁先发送什么以及对方的适当响应达成一致。

于 2011-07-16T17:17:56.383 回答