Почему ruby ​​может не распознать, что дочерний процесс (открытый с помощью popen) завершен? - PullRequest
0 голосов
/ 09 сентября 2011

Дочерний процесс запускается с использованием следующего кода:

IO.popen("/path/to/process/in/question") do |command|
    command.each do |line|
        puts line
    end
end
puts "Child Process Complete"

Отдельные строки, выводимые дочерним процессом, правильно отображаются на консоли вплоть до одной, включая непосредственно перед выходом из процесса. Однако сообщение «Дочерний процесс завершен» не отображается, пока я не нажму ctrl-c .

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

[Редактировать] Я, вероятно, также должен упомянуть, что дочерний процесс также может быть запущен непосредственно из командной строки, и при этом никаких проблем не наблюдается.

1 Ответ

0 голосов
/ 09 сентября 2011

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

Размещенный выше код Ruby сделал вызов начальному сценарию оболочки.Это, в свою очередь, вызывало второй сценарий оболочки, который содержал следующую мерзость:

(some_application) &
>/dev/null 2>&1

Я не уверен, что это то, что произошло, но способ, которым я прочитал это, заключается в том, что some_application запускается и запускается какфоновый процесс.Стандартный вывод перенаправляется на / dev / null, а стандартная ошибка перенаправляется на стандартный вывод ... , но к какому процессу относится это перенаправление ?

Изменение вызова на

some_application >/dev/null 2>&1 &

(т. Е. Запуск some_application, выбрасывающего стандартную консоль и записывающего стандартную ошибку на консоль) заставил все мои проблемы уйти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...