我编写了这段代码来使我的进程在守护进程中运行。目标是即使关闭其父进程,该进程仍将继续运行。现在,我想能够在其标准输入(stdin)中输入一些内容。我该怎么做?下面是代码:
def daemonize(cmd, options = {})
rd, wr = IO.pipe
p1 = Process.fork {
Process.setsid
p2 = Process.fork {
$0 = cmd #Name of the command
pidfile = File.new(options[:pid_file], 'w')
pidfile.chmod( 0644 )
pidfile.puts "#{Process.pid}"
pidfile.close
Dir.chdir(ENV["PWD"] = options[:working_dir].to_s) if options[:working_dir]
File.umask 0000
STDIN.reopen '/dev/null'
STDOUT.reopen '/dev/null', 'a'
STDERR.reopen STDOUT
Signal.trap("USR1") do
Console.show 'I just received a USR1', 'warning'
end
::Kernel.exec(*Shellwords.shellwords(cmd)) #Executing the command in the parent process
exit
}
raise 'Fork failed!' if p2 == -1
Process.detach(p2) # divorce p2 from parent process (p1)
rd.close
wr.write p2
wr.close
exit
}
raise 'Fork failed!' if p1 == -1
Process.detach(p1) # divorce p1 from parent process (shell)
wr.close
daemon_id = rd.read.to_i
rd.close
daemon_id
end
有没有一种方法可以重新打开类似于管道的stdin,而不是在/dev/null中,我能够在其中写入?
mkfifo
之后,尝试将其作为流打开将会阻塞,直到有数据被写入。您可以在新线程中打开它以绕过此问题,请参见更新后的答案以获取基本示例。 - Jon Cairns