为什么docker exec在退出时杀死nohup进程?

Mar*_*ski 6 bash nohup docker

我已经运行了docker ubuntu容器,里面只有一个bash脚本.我想用docker exec在那个容器内启动我的应用程序:

docker exec -it 0b3fc9dd35f2 ./main.sh
Run Code Online (Sandbox Code Playgroud)

在主脚本里面我想用nohup运行另一个应用程序,因为这是一个运行时间很长的应用程序:

#!/bin/bash
nohup ./java.sh &
#with this strange sleep the script is working
#sleep 1
echo `date` finish main >> /status.log
Run Code Online (Sandbox Code Playgroud)

java.sh脚本如下(为简单起见,它是一个虚拟脚本):

#!/bin/bash
sleep 10
echo `date` finish java >> /status.log
Run Code Online (Sandbox Code Playgroud)

问题是在docker exec返回后java.sh被立即杀死.问题是为什么?

我发现的唯一解决方案是sleep 1在nohup启动后在第一个脚本中添加一些虚拟.比第二个进程运行正常.你知道为什么会这样吗?

[编辑]

第二种解决方案是在睡眠前向脚本添加一些echotrap命令java.sh.比它工作正常.不幸的是我不能使用这个解决方法而不是这个脚本我有java进程.

ade*_*aru 7

这不是答案,但我仍然没有评论所需的声誉.

我不知道为什么nohup不起作用.但我使用你的想法做了一个有效的解决方法:

docker exec -ti running_container bash -c 'nohup ./main.sh &> output & sleep 1'
Run Code Online (Sandbox Code Playgroud)


E.B*_*Big 7

好的,让我们加入上面的两个答案:D

首先rcmgleite说的完全正确:使用

-d

将进程作为“分离”背景运行的选项。

其次(最重要的!)如果您运行独立进程,则不需要 nohup

deploy_app.sh

#!/bin/bash
cd /opt/git/app
git pull
python3 setup.py install
python3 -u webui.py >> nohup.out
Run Code Online (Sandbox Code Playgroud)

在容器内执行此操作

docker exec -itd container_name bash -c "/opt/scripts/deploy_app.sh"
Run Code Online (Sandbox Code Playgroud)

核实

$ docker attach container_name
$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  11768  1940 pts/0    Ss   Aug31   0:00 /bin/bash
root       887  0.4  0.0  11632  1396 pts/1    Ss+  02:47   0:00 /bin/bash /opt/scripts/deploy_app
root       932 31.6  0.4 235288 32332 pts/1    Sl+  02:47   0:00 python3 -u webui.py
Run Code Online (Sandbox Code Playgroud)


rcm*_*ite 6

我知道这是一个迟到的回复,但出于文档原因我会将其添加到此处。

当在 bash 上使用 nohup 并在 docker 容器上使用“exec”运行它时,您应该使用

$ docker exec -d 0b3fc9dd35f2 /bin/bash -c "./main.sh"

-d 选项的含义是:

-d, --detach 分离模式:在后台运行命令

有关 docker exec 的更多信息,请参阅: https ://docs.docker.com/engine/reference/commandline/exec/

这应该可以解决问题。