nohup ... & 在 docker 脚本中没有按预期工作

Kar*_*lek 4 bash nohup docker

我有一个像这样的简单 Dockerfile

FROM ubuntu:latest
ADD run.sh /run.sh
CMD /run.sh
Run Code Online (Sandbox Code Playgroud)

在 run.sh 中,我有这个(也非常简单)

#!/bin/bash
nohup awk 'BEGIN { while (c++<50) print "y" }' &
sleep 10
Run Code Online (Sandbox Code Playgroud)

当我在 docker 中从 bash 运行脚本时(即,在交互模式下运行 bash 命令并在那里运行脚本),它工作正常——它进入“nohup 模式”并且输出正确地在 nohup.out 中。

但是,如果我使用/run.sh默认命令运行 docker 容器,则输出仍为 STDOUT。

我究竟做错了什么?为什么它可以在 docker 和 bash 中工作,但只能在交互模式下运行?

Gil*_*il' 10

nohup如果它要去终端,则仅重定向命令的输出。如果输出已经转到另一种类型的文件(例如常规文件或管道),则nohup假定这是需要的并且不会重定向到nohup.out.

默认情况下,docker run通过套接字运行命令(将主机与虚拟环境连接 - 这就是它们的通信方式)。套接字不是终端,因此nohup不执行任何重定向。

如果您运行,docker run -tDocker 将模拟容器中的终端,因此nohup将重定向到nohup.out. 如果您不传递命令名称,则 docker 的行为就像您使用了docker run -t bash.

最好的解决方案是将命令的输出显式重定向到您选择的日志文件。不要忘记重定向 stderr。这样你就知道他们要去哪里了。

nohup awk 'BEGIN { while (c++<50) print "y" }' >myscript.log 2>&1 &
Run Code Online (Sandbox Code Playgroud)