虽然Ruby现在是我选择的语言,但如果有人用其他语言的例子回答这个问题,我并不介意,因为我对这个概念更感兴趣。
如果我在后台运行脚本;我如何编写该脚本以便在数据输入仍在运行时将数据输入传递给它?
如果我在终端中运行它在前台,解决方案就像创建一个Thread一样简单,并在STDIN上杀死该线程,此时一个单独的函数将调用它来处理用户输入。 但是考虑到此脚本在后台运行,该方法不实用。我认为参数是与程序接口的最佳方式(虽然我可能错了)。
当然有很多方法可以将数据传递给后台程序,比如将它链接到一个文件,然后我也会写入数据,然后程序读取。 但我希望这些数据严格通过终端输入。
详细说明:有一个操作系统进程在后台永久运行,但我可以通过运行如下命令来传递数据以改变其功能:program_name -newdata
,我正在尝试将相同的功能编程到我自己的一个脚本中。
提前致谢。
答案 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)
有很多方法可以实现这种行为。假设你想要一些简单的东西,你可以尝试这些解决方案:
您可以通过文件传递数据,定义对此文件的特定访问权限并依赖您的操作系统。
您还可以实现经过身份验证的服务,并在本地套接字上绑定此服务。