【问题标题】:Running a background process versus running a pipeline in the background运行后台进程与在后台运行管道
【发布时间】:2021-04-06 21:31:01
【问题描述】:

我想从 Docker 容器中输出一个日志文件,但偶然发现了一些我不明白的东西。这两行不会失败,但只有第一行可以按我的意愿工作:

tail --follow "/var/log/my-log" &
tail --follow "/var/log/my-log" | sed -e 's/^/prefix:/' &

检查正在运行的容器内部,我看到进程正在运行,但我只看到容器输出中第一行的输出。

Dockerfile

FROM debian:buster-slim

COPY boot.sh /

ENTRYPOINT [ "/boot.sh" ]

boot.sh

必须使其可执行 (chmod +x)!

#!/bin/sh

echo "starting"

echo "start" > "/var/log/my-log"
tail --follow "/var/log/my-log" &
tail --follow "/var/log/my-log" | sed -e 's/^/prefix:/' &

echo "sleeping"

sleep inf

跑步

  • 将以上两个文件放到一个文件夹中。
  • 使用docker build --tag pipeline . 构建映像
  • 使用docker run --init --rm --name pipeline pipeline 在一个终端中运行映像。在这里您还可以查看容器的输出。
  • 在第二个终端中,使用docker exec -it pipeline bash 打开一个shell,然后运行例如date >> /var/log/my-log。您还可以在此处运行两个 tail ... 命令以查看它们应该如何工作。
  • 要停止容器,请使用docker kill pipeline

我希望在容器的输出中找到两个tail ... 命令的输出,但它在日志文件的初始“开始”条目上已经失败。添加前缀的 tail 命令也会忽略日志文件的其他条目。

顺便说一句:我欢迎使用管道/FIFO 的解决方法,以避免从一开始就编写持久性日志文件。我仍然想了解为什么这会失败。 ;)

【问题讨论】:

  • 在第二个命令中,您只是将 sed 命令运行到后台,而不是初始 tail 命令。试试 (tail --follow "/var/log/my-log" | sed -e 's/^/prefix:/') &
  • 嗨@RamanSailopal!感谢您的建议,但这不起作用。另外,我不会说这就是管道的工作方式。毕竟,运行例如htop,我验证了所有进程都在运行(即tail 命令和sed),但只有独立的tail 产生退出容器的任何输出。

标签: docker sh pipeline


【解决方案1】:

根据我的测试,似乎sed 导致了在运行容器时没有出现此命令tail --follow "/var/log/my-log" | sed -e 's/^/prefix:/' & 的输出的问题。这个问题可以通过将-u 传递给sed 来解决,这会禁用缓冲。

最终的工作boot.sh如下:

#!/bin/sh

echo "starting"

echo "start" > "/var/log/my-log"
tail --follow "/var/log/my-log" &
tail --follow "/var/log/my-log" | sed -u -e 's/^/prefix:/' &

echo "sleeping"
sleep inf

容器运行后的输出是:

starting
sleeping
start
prefix:start

将更多数据附加到日志文件也将按预期显示。

starting
sleeping
start
prefix:start
newlog
prefix:newlog

另见:why cant I redirect the output from sed to a file

【讨论】:

  • 是的,谢谢,就这么简单。 :) 只是为了完整性,即使没有 -u 标志,sed 也会在某些时候读取输入数据并进行处理。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
相关资源
最近更新 更多