Не могу прочитать вывод stdout внешних команд после деамонизации скрипта Python - PullRequest
0 голосов
/ 02 ноября 2018

Я написал RPC-сервер foo на Python, который я деамонизировал с

start-stop-daemon --start --quiet --background \
                  --make-pidfile \
                  --pidfile /var/run/foo.pid \
                  -- /opt/foo

Все работает нормально, за исключением того, что каждое использование subprocess.check_call(some_cmd) или os.popen(some_cmd).read(1048576) в моем демоне возвращает пустую строку по сравнению со случаем, когда я запускаю foo на переднем плане.

Внешняя программа some_cmd все еще успешно выполняется (как я вижу в журналах), но у меня нет доступа к материалам, которые она выводит на стандартный вывод.

Почему это так и какие изменения я могу внести в вызов start-stop-daemon или в мой код Python, чтобы исправить это?

PS: я обнаружил, что только вывод некоторых команд теперь пуст: subprocess.check_output('echo "Hello World"', shell=True) по-прежнему ведет себя нормально, тогда как вывод subprocess.check_output('/etc/init.d/apache2 --nocolor reload', shell=True) теперь пуст.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я решил это сам. Проблема заключалась в том, что start-stop-daemon устанавливает переменную среды EINFO_QUIET при запуске с флагом --quite (не задокументировано на страницах руководства ...).

Сценарии инициализации OpenRC не выводят ничего на стандартный вывод, когда эта переменная установлена. Простой

import os
os.environ["EINFO_QUIET"] = "NO"

решает проблему.

0 голосов
/ 05 ноября 2018

Из названия проблемы, если это попытка доступа к stdout, это возможно, если есть терминал с процессом. Когда демонизирован, нет терминала.

...