Данные, отправленные на $stdout
, не распечатываются немедленно - они буферизируются. С другой стороны, $stderr
не буферизируется, и когда вы пишете в него, вы сразу видите результаты. Давайте посмотрим на минимальный пример.
STDOUT.puts :stdout
STDERR.puts :stderr
Сохраните его как test.rb
и замените thin start
на ruby test.rb
. Скорее всего, stdout
будет напечатано после stderr
. Чтобы исправить это, нам нужно использовать метод IO#sync=
STDOUT.sync = true
STDOUT.puts :stdout
STDERR.puts :stderr
Теперь stdout
будет печататься синхронно, как и stderr
, и результирующий порядок печатаемых строк должен быть интуитивно понятным.
Первоначальный недостаток вывода вашего ребенка. Тонкий процесс может быть вызван тем, что ребенок не сбрасывает данные в STDOUT. Первый фрагмент данных, записанный в STDERR, вызывает сброс STDOUT. Попробуйте добавить STDOUT.sync = true
где-нибудь в источниках вашего приложения или Thin и посмотрите, помогло ли это.
См. Также обсуждение на ruby-forum.com под названием захват вывода в режиме реального времени .