2

nohup. 基本上我正在这样做:

require 'logger'

logger_file = open('/mnt/dbsdata/output.log', File::WRONLY | File::APPEND | File::CREAT)
LOGGER = Logger.new(logger_file)
LOGGER.level = Logger::INFO

  def run_command(cmd,display=true)
    if display
      LOGGER.info "Executing: #{cmd}"
    end
    output = `#{cmd} 2>&1` ; results=$?.success?
    if ! results
        LOGGER.error "FAILED to execute #{cmd}"
        LOGGER.error output
        return false
    end
    return true
  end

begin
  run_command("some_longrunning_command", true)
  run_command("some_other_longrunning_command",true)
  # etc...
end

这里奇怪的是,当使用上面的 Logger 时,和putsSTDOUT (nohup.out) 一样正常,输出时间都偏离了。我想我可以只跟踪日志文件并查看实时日志记录消息(日志消息、执行命令、重复),但是正在发生的事情是大量刷新消息以一次记录许多过时的消息,在他们的命令很久之后已经执行并完成。

从 shell 执行这样的脚本时:

`nohup ruby myscript.rb &`

当不在 nohup 下运行时,这将按预期运行。

有没有人经历过这个并且知道一个好的解决方法?

4

2 回答 2

2

我不能肯定地说,但这听起来像是一个 IOsync问题。I/O 通常被缓冲以提高速度。RAM 比磁盘快得多,因此读取和写入是临时存储的,直到代码请求数据或磁盘能够接收数据。Ruby 的 IO 类具有sync=让您告诉 Ruby 在写入时立即刷新缓冲区的方法。

这应该有效:

logger_file = open('/mnt/dbsdata/output.log', File::WRONLY | File::APPEND | File::CREAT)
logger_file.sync = true
LOGGER = Logger.new(logger_file)
LOGGER.level = Logger::INFO

为简单起见,您可以使用以下命令为输出创建所需的正确模式:

    logger_file = File.open('/mnt/dbsdata/output.log', 'a')
于 2013-10-18T19:48:12.003 回答
0

听起来像缓冲。尝试登录到 stderr 看看是否有帮助。

于 2013-10-18T19:44:14.947 回答