@Tiasar
Web Developer

Почему супервизор не показывает stdout от скрипта питона?

Dockerfile:
FROM ubuntu
RUN apt update && apt install -y python3 python3-pip
RUN pip3 install getmail6 mail_parser supervisor supervisor-stdout
RUN useradd -m -p irp_agent irp_agent
RUN mkdir -p /home/irp_agent/.config/getmail
COPY getmailrc /home/irp_agent/.config/getmail
COPY agent.py /home/irp_agent
COPY supervisor.irp_agent.conf /etc/supervisor/conf.d/irp_agent.conf
RUN chown -R irp_agent:irp_agent /home/irp_agent \
	&& chmod 0640 /home/irp_agent/.config/getmail/getmailrc \
	&& chmod 0750 /home/irp_agent/agent.py \
	&& chmod 0640 /etc/supervisor/conf.d/irp_agent.conf

Конфиг супервизора (/etc/supervisor/conf.d/irp_agent.conf)
[supervisord]
nodaemon = true
user = root
logfile=/dev/null
logfile_maxbytes=0

[programm:irp_agent]
autostart = true
autorestart = true
user = irp_agent
environment = PYTHONUNBUFFERED=1
directory = /home/irp_agent
command = agent.py

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
stdout_events_enabled=true
stderr_events_enabled=true

Код скрипта (agent.py)
#!/usr/bin/python3

import sys
import datetime
import time

time.sleep(1)

now = datetime.datetime.now()

sys.stderr.write('stderr: ' + str(now) + '\n')
print('stdout: ' + str(now) + '\n')
print("fatal error" + '\n', file=sys.stderr)

При старте супервизора - /usr/local/bin/supervisord -c /etc/supervisor/conf.d/irp_agent.conf

2020-12-19 10:02:09,286 INFO Set uid to user 0 succeeded
2020-12-19 10:02:09,287 INFO supervisord started with pid 10

и тишина...

Если запустить скрипт agent.py то все выводится нормально

Пробовал и так user = python3 -u irp_agent
и в самом скрипте #!/usr/bin/python3 -u

Сообщений в супервизоре нет... Что я упускаю?
  • Вопрос задан
  • 489 просмотров
Решения вопроса 1
вот работающий пример: ( ... правда с переменой пользователя не заморачивался ) :

Dockerfile
# supervisor docker example
FROM jfloff/alpine-python
RUN apk add --no-cache supervisor && rm -rf /var/lib/apt/lists/*
RUN sed -i 's/^\(\[supervisord\]\)$/\1\nnodaemon=true/' /etc/supervisord.conf
RUN mkdir -p /etc/supervisor.d/
COPY server.py server.py
COPY agent.conf etc/supervisor.d/agent.ini
# for server.py
ARG SERVICE_PORT=8080
ENV SERVICE_PORT=$SERVICE_PORT
EXPOSE $SERVICE_PORT
# NOTE: not ENTRYPOINT
CMD ["supervisord", "-c", "/etc/supervisord.conf"]

agent.conf
[program:server]
autostart = true
autorestart = true
user = root
environment = PYTHONUNBUFFERED=1
directory = /
command = python server.py
stderr_logfile=/var/log/server.err
stdout_logfile=/var/log/server.out
команды

docker build -t example -f Dockerfile .
docker rm example_container
docker run -it --name example_container example

2020-12-19 18:00:54,578 CRIT Supervisor is running as root.  Privileges were not dropped because no user is specified in the config file.  If you intend to run as root, you can set user=root in the config file to avoid this message.
2020-12-19 18:00:54,578 INFO Included extra file "/etc/supervisor.d/agent.ini" during parsing
2020-12-19 18:00:54,588 INFO RPC interface 'supervisor' initialized
2020-12-19 18:00:54,588 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2020-12-19 18:00:54,589 INFO supervisord started with pid 6
2020-12-19 18:00:55,594 INFO spawned: 'server' with pid 8
2020-12-19 18:00:56,597 INFO success: server entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)


docker exec -it example_container supervisorctl status server


server                           RUNNING   pid 8, uptime 0:00:14


docker exec -it example_container sh

ls /var/log/
server.err       server.out       supervisord.log

 ps ax |  grep pytho[n]
    6 root      0:00 {supervisord} /usr/bin/python3 /usr/bin/supervisord -c /etc/supervisord.conf
    8 root      0:00 python server.py
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Tiasar Автор вопроса
Web Developer
UPD: ошибка в лишней букве - [programm:irp_agent]

Хммм
переделал скрипт agent.py
#!/usr/bin/python3 -u

import sys
import os

print("test error", file=sys.stderr)
if not os.path.isdir("/home/irp_agent/test"):
	os.mkdir("/home/irp_agent/test")

Если запустить ручками, папка создается. Если через супервизор то нет, значит скрипт вовсе не запускается... В чем может быть дело?

Журнал супервизора тоже пуст

root@993db16619ec:/# cat /var/log/supervisor.log
2020-12-19 11:13:27,281 INFO Set uid to user 0 succeeded
2020-12-19 11:13:27,284 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2020-12-19 11:13:27,284 INFO supervisord started with pid 10
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы