为什么 docker exec 在退出时杀死 nohup 进程?
Why docker exec is killing nohup process on exit?
我有 运行ning docker ubuntu 容器,里面只有一个 bash 脚本。我想用 docker exec 在那个容器中启动我的应用程序:
docker exec -it 0b3fc9dd35f2 ./main.sh
在主脚本中,我想 运行 另一个带有 nohup 的应用程序,因为这是一个很长的 运行ning 应用程序:
#!/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
问题是 java.sh 在 docker exec returns 之后立即被杀死。问题是为什么?
我发现的唯一解决方案是在启动 nohup 后将一些虚拟 sleep 1
添加到第一个脚本中。比第二个过程 运行ning 好。你知道为什么会这样吗?
[编辑]
第二种解决方案是在睡眠前向 java.sh
脚本添加一些 echo
或 trap
命令。比它工作正常。不幸的是我不能使用这个解决方法,因为我有 java 进程而不是这个脚本。
这不是答案,但我仍然没有评论所需的声望。
我不知道为什么 nohup 不起作用。但是我使用了你的想法做了一个有效的解决方法:
docker exec -ti running_container bash -c 'nohup ./main.sh &> output & sleep 1'
我知道这是一个迟到的回复,但出于文档原因,我会在此处添加它。
在 bash 上使用 nohup 并在 docker 容器上使用 运行 和 'exec' 时,您应该使用
$ docker exec -d 0b3fc9dd35f2 /bin/bash -c "./main.sh"
-d 选项表示:
-d, --detach Detached mode: run command in the
background
有关 docker exec 的更多信息,请参阅:
https://docs.docker.com/engine/reference/commandline/exec/
这应该可以解决问题。
好的,让我们加入上面的两个答案:D
首先rcmgleite说的完全正确:使用
-d
运行 的选项作为 'detached' 后台处理。
第二个(最重要的!)如果您 运行 分离 进程,您 不需要 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
我有 运行ning docker ubuntu 容器,里面只有一个 bash 脚本。我想用 docker exec 在那个容器中启动我的应用程序:
docker exec -it 0b3fc9dd35f2 ./main.sh
在主脚本中,我想 运行 另一个带有 nohup 的应用程序,因为这是一个很长的 运行ning 应用程序:
#!/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
问题是 java.sh 在 docker exec returns 之后立即被杀死。问题是为什么?
我发现的唯一解决方案是在启动 nohup 后将一些虚拟 sleep 1
添加到第一个脚本中。比第二个过程 运行ning 好。你知道为什么会这样吗?
[编辑]
第二种解决方案是在睡眠前向 java.sh
脚本添加一些 echo
或 trap
命令。比它工作正常。不幸的是我不能使用这个解决方法,因为我有 java 进程而不是这个脚本。
这不是答案,但我仍然没有评论所需的声望。
我不知道为什么 nohup 不起作用。但是我使用了你的想法做了一个有效的解决方法:
docker exec -ti running_container bash -c 'nohup ./main.sh &> output & sleep 1'
我知道这是一个迟到的回复,但出于文档原因,我会在此处添加它。
在 bash 上使用 nohup 并在 docker 容器上使用 运行 和 'exec' 时,您应该使用
$ docker exec -d 0b3fc9dd35f2 /bin/bash -c "./main.sh"
-d 选项表示:
-d, --detach Detached mode: run command in the background
有关 docker exec 的更多信息,请参阅: https://docs.docker.com/engine/reference/commandline/exec/
这应该可以解决问题。
好的,让我们加入上面的两个答案:D
首先rcmgleite说的完全正确:使用
-d
运行 的选项作为 'detached' 后台处理。
第二个(最重要的!)如果您 运行 分离 进程,您 不需要 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