Supervisord:是否有可能将子进程的标准输出重新定向回Supervisord?

6
我正在使用 supervisord 作为 Docker 容器的入口点,如 https://docs.docker.com/articles/using_supervisord/ 中所述。 我希望所有日志都写入 stdout,以便利用内置工具例如 docker logs 或 systemd 的日志,特别是在 CoreOS 上运行容器时。
对于 stderr,子进程有一个选项为 redirect_stderr=true, 是否可能将子进程的 stdout 重定向回 supervisord,而不必处理实际的日志文件?

由于supervisor是一个守护进程,我不确定"stdout"是否有任何实际意义——它没有连接到终端或任何有用的地方。接收输出的任何内容也无法区分来自哪个子进程的输出,这将严重限制其实用性。也许你实际需要的是一种将每个输出管道传输到命令的方法,可以使用命名管道(FIFOs)吗? - IMSoP
1
实际上,如果它被用作Docker容器的入口点,它将在前台运行。 - Gal Ben-Haim
嗯,可能吧。但是所有输出合并在一起的观点仍然存在。似乎真正的问题是“我能让监管进程的子进程记录到服务X而不是文件吗?” - IMSoP
https://github.com/ddollar/foreman 实际上在将日志合并到stdout方面做得很好,但它不适用于生产环境,并且如果子进程崩溃,它无法处理重启问题。 - Gal Ben-Haim
1个回答

7
您可以使用以下配置选项将程序的标准输出重定向到监管者的标准输出:
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0

解释:

  • 当一个进程打开 /dev/fd/1(与 /proc/self/fd/1 相同)时,系统实际上克隆了该进程的文件描述符 #1(标准输出)。将其用作 stdout_logfile 将会导致 supervisord 将程序的标准输出重定向到自己的标准输出。
  • stdout_logfile_maxbytes=0 禁用了日志文件轮换,这对于标准输出显然没有意义。不指定此选项将导致错误,因为默认值为50MB,而 supervisor 不足以检测到所指定的日志文件不是常规文件。

更多信息请参见:

http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html


redirect_stderr=true 在这里也非常有用(将程序的 stderr 重定向到 stdout)。 - Tim Tisdall
很不幸,在Linux 4 Tegra上,这对我来说会出现“spawnerr:unknown error making dispatchers for 'ssh-forward_00':ENXIO”的错误。我找不到解决方法。 - Heath Raftery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接