Ruby:如何将数据传递给后台运行的程序

时间:2017-03-04 09:29:43

标签: ruby input background-process

虽然Ruby现在是我选择的语言,但如果有人用其他语言的例子回答这个问题,我并不介意,因为我对这个概念更感兴趣。

如果我在后台运行脚本;我如何编写该脚本以便在数据输入仍在运行时将数据输入传递给它?

如果我在终端中运行它在前台,解决方案就像创建一个Thread一样简单,并在STDIN上杀死该线程,此时一个单独的函数将调用它来处理用户输入。 但是考虑到此脚本在后台运行,该方法不实用。我认为参数是与程序接口的最佳方式(虽然我可能错了)。

当然有很多方法可以将数据传递给后台程序,比如将它链接到一个文件,然后我也会写入数据,然后程序读取。 但我希望这些数据严格通过终端输入

详细说明:有一个操作系统进程在后台永久运行,但我可以通过运行如下命令来传递数据以改变其功能:program_name -newdata ,我正在尝试将相同的功能编程到我自己的一个脚本中。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以使用unix套接字来传递消息。您可以在一个OptionParser文件中执行此操作,但为了简单起见,我将在另外两个文件中执行此操作。

program_name_background文件中,您可以启动正在侦听unix套接字和解析消息的UNIXServer(并在不同的线程中运行您需要的任何内容):

#!/usr/bin/ruby

require 'socket'
require 'json'
require 'FileUtils'

socket_path = "/tmp/program_name_background.sock"

at_exit { FileUtils.rm socket_path }

server = UNIXServer.new socket_path

loop do
  client = server.accept
  message = client.read
  json_message = JSON.parse message, symbolize_names: true
  p json_message

  break if json_message[:type] == "SIGTERM"
end

program_name_control文件中,您可以从命令行读取属性并将消息发送到后台进程:

#!/usr/bin/ruby

require 'socket'
require 'json'

case ARGV[0]
when "-newdata"
  message = {
    type: :newdata,
    data: ARGV[1]
  }
when "stop"
  message = { type: :SIGTERM }
else
  p "Error: unknown param: #{ARGV[0]}"
  exit
end

client = UNIXSocket.open "/tmp/program_name_background.sock"
client.print JSON.generate(message)
client.close

对于解析选项,您可以使用内置的{{3}}

你可以测试它:

  • 开始后台流程:./program_name_background
  • 从其他标签发送消息:./program_name_control -newdata 118

您还可以在/usr/local/bin文件夹中为这些文件设置符号链接,以便您可以在没有前导./

的任何地方调用它们

您可以守护后台进程,以便它不会连接到终端。

答案 1 :(得分:0)

有很多方法可以实现这种行为。假设你想要一些简单的东西,你可以尝试这些解决方案:

您可以通过文件传递数据,定义对此文件的特定访问权限并依赖您的操作系统。

您还可以实现经过身份验证的服务,并在本地套接字上绑定此服务。