如何使用上帝捕获过程输出?

How to capture process output using God?

正在尝试让一个简单的 God 演示正常工作。

在一个空目录中,我根据 God 文档创建了以下文件:

simple.rb:

loop do
  puts 'Hello'
  sleep 1
end

simple.rb:

God.watch do |w|
  w.name = "simple"
  w.start = "ruby simple.rb"
  w.log = 'myprocess.log'
  w.keepalive
end

那我运行:
$ sudo god -c simple.god -D

并得到这个输出:

I [2018-10-31 23:19:39]  INFO: Loading simple.god
I [2018-10-31 23:19:39]  INFO: Syslog enabled.
I [2018-10-31 23:19:39]  INFO: Using pid file directory: /var/run/god
I [2018-10-31 23:19:39]  INFO: Started on drbunix:///tmp/god.17165.sock
I [2018-10-31 23:19:39]  INFO: simple move 'unmonitored' to 'init'
I [2018-10-31 23:19:39]  INFO: simple moved 'unmonitored' to 'init'
I [2018-10-31 23:19:39]  INFO: simple [trigger] process is running (ProcessRunning)
I [2018-10-31 23:19:39]  INFO: simple move 'init' to 'up'
I [2018-10-31 23:19:39]  INFO: simple registered 'proc_exit' event for pid 11741
I [2018-10-31 23:19:39]  INFO: simple moved 'init' to 'up'

但我似乎无法捕捉到所监视进程的实际输出。 'myprocess.log' 文件永远不会被创建或写入。

但除此之外,我只是遇到了一些非常奇怪的行为。就像有时我 运行 它会喷出无穷无尽的输出流,显示进程一个接一个地开始和退出。有时它会在我重命名文件后记录到文件中。我无法弄清楚为什么它的行为如此不稳定。

神 0.13.7 / ruby 2.3.0 / OSX 10.13.6

再次检查您链接到的文档中的示例:

God.watch do |w|
  w.name = "simple"
  w.start = "ruby /full/path/to/simple.rb"
  w.keepalive
end

您使用的是相对路径,而不是完整路径。如果您尝试使用相对路径,它会出错并说它无法在那里创建日志文件。这将导致它按照您的描述循环 start/exit。

此外,请确保在 CTRL-C god 进程之后终止后台 ruby 进程。您可以看到,即使在杀死 god 之后,它也是 运行 ps aux | grep ruby.

最后,puts确实记录到日志文件,但是输出被god缓冲,直到ruby处理simple.rb 终止。重复此过程以确认:

# Confirm no running ruby processes, otherwise kill the processes and re-verify
ps aux | grep ruby
# Start the daemon
god -c simple.god -D

切换到新的 shell 和 运行:

ps aux | grep ruby
  foo           51279   0.0  0.1  4322084  11888   ??  Ss   12:46AM   0:00.09 ruby /Users/foo/simple.rb
  foo           51241   0.0  0.2  4343944  26208 s000  S+   12:46AM   0:00.45 ruby /Users/foo/.rvm/gems/ruby-2.6.0-preview2/bin/god -c simple.god -D
# Kill the process for simple.rb, which causes god to dump the output to the log and restart it
kill 51279
# Verify log file contains expected output
cat myprocess.log
Hello
Hello
Hello
Hello

我建议您继续阅读 god 的文档。内容多多,答案应有尽有