Регистрация от детей супервизорного подпроцесса
Моя система состоит из приложения Python, которое запускается из supervisord. Давайте назовем это A
, A
запускает подпроцесс B
сделать часть своей задачи. И то и другое A
а также B
закодированы в Python и используют стандарт logging
модуль для вывода сообщений на консоль.
stdout
а также stderr
из A
записываются в файл, указанный в конфигурации супервизора. Это работает как шарм. Теперь я хотел бы туннель stdout
а также stderr
от B
в тот же файл, что и в A
, Как этого достичь?
2 ответа
Вам не нужно ничего делать. B
наследуется A
Стандартные потоки по умолчанию.
Если стандартный вывод A перенаправлен в файл, то B
s stout автоматически записывает в то же место.
Модуль подпроцесса Python предоставляет средства для чтения дочерних элементов stdout и stderr. Вы можете захватить их и отправить их в свой логгер. Ниже приведена версия после выполнения, которая отправляет весь вывод в журналы после завершения дочернего процесса. Это можно сделать также построчно, и вы можете найти примеры, читающие стандартный вывод подпроцесса в Stackru.
worker = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
worker.wait()
logger.debug("Subprocess %s stdout: %s", cmdline, worker.stdout.read().decode("utf-8"))