如何将信号发送到在码头集装箱中运行的程序?
答
您可以使用nsenter进入您的容器空间并发送信号。
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid kill -SIGINT <PID of your program inside your container>
更多信息:http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/
答
您可以使用docker kill --signal="<signal>" <container name or id>
任何信号发送到指定容器的根进程。
+0
是的,但我想要发送信号的程序是在容器中运行的程序,但不一定是根进程。例如在Docker中运行bash,然后在docker中的bash中运行其他命令。感谢您的回答。 – atupal 2014-09-06 08:14:50
答
-
docker kill
用于发送信号到主容器处理过程即与PID 1. - 任何应用程序与PID 1可直接处理信号。下面的命令杀掉主要泊坞窗过程:
$ docker kill --signal="SIGTERM" container-id/name
- 但应用程序,它不具有PID 1即应用程序是后台进程:
- 我们不能发送单直接泊坞窗容器中运行任何后台进程。
- 在这种情况下,我们需要在作为入口点运行的shell脚本中捕获和处理用户定义的信号。
- 让我们有以下
Dockerfile
。 (更新它根据应用)
FROM centos:6.7
# Install/Deploye the service below.
# Copy the shell script.
COPY entrypoint.sh /home
EXPOSE 8080
ENTRYPOINT ["/home/entrypoint.sh"]
-
以下为
entrypoint.sh
。 (根据应用程序更新它)。假设我们想重新启动一个init.d
服务。#start the service /etc/init.d/<servicename> start pid="$!" # SIGUSR1- Single handler my_handler() { /etc/init.d/<servicename> restart } # Trap and handle the user defind singnal. trap 'my_handler' SIGUSR1 # wait forever(Alive container.) while true do tail -f /dev/null & wait ${!} done
- 构建docker镜像并运行容器。
- 现在你可以重新从主机服务:
$docker kill --signal="SIGUSR1" container-id/name
答
我设法在泊坞窗容器由信号我想发送到进程(程序):
- 获取的的ID集装箱 - docker ps | grep的yourProgramName - 使用泊坞窗EXEC -IT 4b6425cf4261庆典
- 列出所有正在运行与PS -A过程
- 找到PID 4b6425cf4261
- 登录到容器中 - 对我来说,它看起来像这样过程中要发送一个SIGINT到
- 将信号发送到它:杀-SIGINT PID(例如:杀-SIGINT 15)
您现在可以使用'docker exec'代替nsenter。 https://docs.docker.com/reference/commandline/exec/ – Andy 2015-07-20 19:07:17