我想在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在\。
中创建守护进程创建命名管道mkfifo ./my_pipe。
ruby controller.rb start
cat> my_pipe
输入文字
ctrl-c停止输入
cat o.output查看您的输出
答案 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
)。
服务器的一般配方是:
在客户端:
您的服务器和客户需要就谁先发送内容以及另一方发出适当的响应达成一致。