の下で実行しているときに、Ruby スクリプトでいくつかの紛らわしい動作が見られ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 を使用している場合と、puts
STDOUT (nohup.out) に対して通常どおりに使用している場合の両方で、出力タイミングがかなりずれていることです。ログファイルを追跡して、リアルタイムのログメッセージ (ログメッセージ、コマンドの実行、繰り返し) を確認できると思いますが、コマンドが実行されてからずっと後に、多くの古いメッセージを一度にログに記録するためのメッセージの一括フラッシュが発生しています。すでに実行され、完了しています。
シェルから次のようにスクリプトを実行する場合:
`nohup ruby myscript.rb &`
nohup で実行されていない場合、これは期待どおりに動作します。
誰もがこれを経験し、良い回避策を知っていますか?