为什么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
脚本添加一些echo
或trap
命令。 比它工作正常。 不幸的是,我不能使用这个解决方法,而不是这个脚本我有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/
这应该做的伎俩。