【问题标题】:supervisord: is it possible to redirect subprocess stdout back to supervisord?supervisord:是否可以将子进程 stdout 重定向回 supervisord?
【发布时间】:2014-10-04 12:15:40
【问题描述】:

我使用 supervisord 作为 Docker 容器的入口点,如 https://docs.docker.com/articles/using_supervisord/ 中所述, 我希望将所有日志写入标准输出,这样我就可以利用 docker logs 或 systemd 的日志等内置工具,尤其是在 CoreOS 上运行容器时。

对于 stderr,子进程有 redirect_stderr=true 选项, 是否可以以某种方式将子进程 stdout 重定向回 supervisord 而不处理实际的日志文件?

【问题讨论】:

  • 由于主管是一个守护进程,我不确定“stdout”有什么真正的意义——它没有连接到终端或任何有用的地方。接收输出的任何东西也无法区分哪个输出来自哪个子流程,这将严重限制其有用性。也许您真正需要的是一种将每个输出通过管道传输到命令的方法,也许是使用命名管道 (FIFO)?
  • 实际上,如果它用作 Docker 容器的入口点,它会在前台运行
  • 嗯,可能。不过,关于所有输出合并在一起的观点是站得住脚的。似乎真正的问题是“我可以让主管子进程登录到服务 X 而不是文件吗?”
  • github.com/ddollar/foreman 实际上在将日志合并到标准输出方面做得很好,它的问题是它不打算在生产中运行并且它不处理子进程的重新启动,如果他们崩溃了

标签: docker supervisord coreos


【解决方案1】:

您可以使用以下配置选项将程序的标准输出重定向到主管的标准输出:

stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0

解释:

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

更多信息:

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

【讨论】:

  • redirect_stderr=true在这里也很有用(将stderr重定向到程序上的stdout)
  • 不幸的是,在 Linux 4 Tegra 上,这给了我spawnerr: unknown error making dispatchers for 'ssh-forward_00': ENXIO。找不到解决方法。
猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多