Я вижу некоторое запутанное поведение со скриптом 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.
Кто-нибудь сталкивался с этим и знает хороший обходной путь?