为什么docker执行官在退出时正在扼杀nohup进程?

我有一个bash脚本里面运行dockerUbuntu的容器。 我想用Docker exec来启动我的应用程序:

docker exec -it 0b3fc9dd35f2 ./main.sh 

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

 #!/bin/bash nohup ./java.sh & #with this strange sleep the script is working #sleep 1 echo `date` finish main >> /status.log 

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

 #!/bin/bash sleep 10 echo `date` finish java >> /status.log 

问题是在docker exec返回之后java.sh被立即终止。 问题是为什么?

我发现的唯一解决方法是在nohup启动后,在第一个脚本中添加一些虚拟sleep 1 。 比第二个进程运行良好。 你有什么想法,为什么这样?

[编辑]

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

这不是一个答案,但我还没有所需的名誉评论。

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

 docker exec -ti running_container bash -c 'nohup ./main.sh &> output & sleep 1' 

好的,让我们join上面的两个答案: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 

在容器内执行此操作

 docker exec -itd container_name bash -c "/opt/scripts/deploy_app.sh" 

核实

 $ 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 

我知道这是一个迟到的反应,但我会在这里添加它的文件的原因。

在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/

这应该做的伎俩。