Побочные эффекты переопределения $ stdout и $ stderr в приложении Rails - PullRequest
5 голосов
/ 13 июля 2011

Я бы хотел временно перенаправить $stdout и $stderr в файл в сценарии, который будет запускаться script/runner в приложении Rails. Есть ли потенциальные побочные эффекты для этого? Приведет ли изменение глобальной переменной к тому, что выходные потоки будут перенаправлены в другие части приложения Rails во время моего сценария? А как насчет других библиотек или потоков, используемых скриптом?

Ответы [ 3 ]

2 голосов
/ 13 июля 2011

Обычно я выполняю все свои задания cron с помощью сценария-оболочки , который сохраняет stdout / err и печатает все, если подпроцесс завершается с ненулевым кодом ошибки (поэтому я получаю электронное письмо от cron в случае сбоя).

2 голосов
/ 13 июля 2011

Стандартный поток вывода и стандартные ошибки обычно доступны двумя способами:

  • $stdout и STDOUT
  • $stderr и STDERR

Достаточно умный человек может также открыть свои собственные копии, используя IO.new с аргументом дескриптора файла:

sneaky = IO.new(2, 'w')

И теперь у вас есть доступ на запись к стандартупоток ошибок через sneaky, не имеющий ничего общего с $stderr или STDERR.

Переназначение $stderr и $stdout должно работать нормально, если что-то в вашем коде, ваших гемах или самом Ruby не являетсяиспользуя константы (STDOUT, STDERR) или осуществляет доступ к потокам напрямую через stdio C, низкий уровень unix read / write с помощью числовых файловых дескрипторов или открывает собственный доступ к потокам с помощью IO.new.Я не копался в источнике, но сомневаюсь, что присвоение $stdout сделает что-нибудь для stdout в C-land или файлового дескриптора 1 в Unix-land.

Если вам действительно нужно перехватить стандартвывод и потоки ошибок, тогда вам, вероятно, лучше написать сценарий оболочки-оболочки, чтобы перенаправить потоки за вас.


ОБНОВЛЕНИЕ : Если вы в основном (только?) обеспокоеныо том, чтобы изменить $stdout и $stderr внутри вашего script/runner кровотечения в остальной части вашего Rails-приложения, тогда вам не нужно об этом беспокоиться.Каждый процесс - ваш script/runner процесс и сколько угодно серверных процессов, запущенных вашим основным приложением, - получает свой собственный набор глобальных переменных, так что вы можете изменять их в своем сценарии так, как вам хочется, без проблем в вашем основном приложении.Конечно, вам все равно придется беспокоиться о драгоценных камнях, используя STDOUT вместо $stderr или IO.new, чтобы получить свой собственный частный стандарт.

0 голосов
/ 13 июля 2011

Конечно, это зависит от того, какие другие гемы вы используете, как настроены ваши логи и запуск сервера.Я думаю, последующий вопрос: зачем тебе это?Вероятно, есть лучший способ достичь цели.

...