【问题标题】:Handling Input and Output of a Daemon处理守护进程的输入和输出
【发布时间】:2011-10-06 19:53:54
【问题描述】:

我想在 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. ruby controller.rb 启动

  3. cat > my_pipe

  4. 输入文字

  5. ctrl-c 停止输入

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

【问题讨论】:

    标签: ruby linux daemons


    【解决方案1】:

    可能是最简单的方法,命名管道,基于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】:

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

    服务器的一般配方是:

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

    在客户端:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2015-12-04
      相关资源
      最近更新 更多