Назад | Перейти на главную страницу

Можно ли с supervisord запустить процесс, не перехватывая stdout?

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

root@714811eb811b:/tmp# cat a.sh
#!/bin/sh

exec > /proc/$(cat /tmp/supervisord.pid)/fd/1
echo This text goes to the k8s log
root@714811eb811b:/tmp# cat config
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid

[program:write]
command=/tmp/a.sh
exitcodes=0
root@714811eb811b:/tmp# supervisord -c config
2017-12-02 00:34:14,245 CRIT Supervisor running as root (no user in config file)
2017-12-02 00:34:14,248 INFO supervisord started with pid 451
2017-12-02 00:34:15,256 INFO spawned: 'write' with pid 454
This text goes to the k8s log
2017-12-02 00:34:15,262 INFO exited: write (exit status 0; not expected)
2017-12-02 00:34:16,270 INFO spawned: 'write' with pid 456
This text goes to the k8s log
2017-12-02 00:34:16,276 INFO exited: write (exit status 0; not expected)
^C2017-12-02 00:34:17,027 WARN received SIGINT indicating exit request

Как было сказано выше, это ужасный взлом. Есть ли подходящий способ указать супервизору привязать стандартный вывод дочерних элементов к его собственному стандартному выводу? (т. е. сказать супервизору ничего не делать и просто позволить потомкам унаследовать обычные файловые дескрипторы)

Кстати, почему перезапускается скрипт? Даже без явного назначения кодов выхода супервизору следует ожидать, что код выхода равен 0.