【发布时间】:2013-10-18 17:30:34
【问题描述】:
在nohup 下运行时,我发现 Ruby 脚本存在一些令人困惑的行为。基本上我是这样做的:
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 时,以及正常的 puts 到 STDOUT (nohup.out) 时,输出时序都相差甚远。我想我可以只跟踪日志文件并查看实时记录消息(记录消息、执行命令、重复),但是正在发生的事情是大量刷新消息以一次记录许多过时的消息,在他们的命令很久之后已经执行并完成。
当像这样从 shell 执行脚本时:
`nohup ruby myscript.rb &`
当不在 nohup 下运行时,它的行为与预期一样。
有人遇到过这种情况并知道一个好的解决方法吗?
【问题讨论】: