linux - 从 Docker 容器内部杀死子进程会杀死整个容器

标签 linux docker process kill

在我的 Windows 机器上,我从 docker compose 启动了一个 Docker 容器。我的入口点是一个 Go filewatcher,它在每次文件更改时运行任务管理器的任务。执行的任务构建并运行 Go 程序。

但是在我可以在文件更改后再次构建和运行程序之前,我必须终止之前运行的版本。但是每次我杀死应用程序进程时,容器也不见了。

在此示例中,目标是仅终止 PID 为 74 的 svc1 进程。我尝试了 pkill -9 svc1kill $(pgrep svc1)。但是每次父进程也被杀死。

容器内部的命令行输出:

root@bf073c39e6a2:/app/cmd/svc1# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  2.5  0.0 104812  2940 ?        Ssl  13:38   0:00 /go/bin/watcher
root        13  0.0  0.0 294316  7576 ?        Sl   13:38   0:00 /go/bin/task de
root        74  0.0  0.0 219284  4908 ?        Sl   13:38   0:00 /svc1
root        82  0.2  0.0  18184  3160 pts/0    Ss   13:38   0:00 /bin/bash
root        87  0.0  0.0  36632  2824 pts/0    R+   13:38   0:00 ps -aux
root@bf073c39e6a2:/app/cmd/svc1# ps -afx
  PID TTY      STAT   TIME COMMAND
   82 pts/0    Ss     0:00 /bin/bash
   88 pts/0    R+     0:00  \_ ps -afx
    1 ?        Ssl    0:01 /go/bin/watcher -cmd /go/bin/task dev -startcmd
   13 ?        Sl     0:00 /go/bin/task dev
   74 ?        Sl     0:00  \_ /svc1
root@bf073c39e6a2:/app/cmd/svc1# pkill -9 svc1
root@bf073c39e6a2:/app/cmd/svc1

切换到容器日志:

task: Failed to run task "dev": exit status 255
2019/08/16 14:20:21 exit status 1

“dev”是任务管理器中任务的名称。

Dockerfile:

FROM golang:stretch
RUN go get -u -v github.com/radovskyb/watcher/... \
    && go get -u -v github.com/go-task/task/cmd/task
WORKDIR /app
COPY ./Taskfile.yml ./Taskfile.yml
ENTRYPOINT ["/go/bin/watcher", "-cmd", "/go/bin/task dev", "-startcmd"]

我希望只有具有目标 PID 的进程被终止,而不是生成它的父进程。

最佳答案

您可以使用“supervisord”之类的进程管理器,并将其配置为重新执行您的脚本或命令,即使您终止了它的进程,这将使您的容器保持正常运行。

关于linux - 从 Docker 容器内部杀死子进程会杀死整个容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57526449/

相关文章:

linux - 如何在 tcpdump 中仅转储传出 IP 数据包?

linux - cronjob等待理解

docker - docker 客户端守护程序访问远程群 `1.12.1`管理器

python - (2002, "Can' t 通过套接字 '/var/run/mysqld/mysqld.sock' (2) 连接到本地 MySQL 服务器”)

.net - 如何将 Visual Studio 附加到尚未启动的进程?

linux - 将所有 OS 进程绑定(bind)到一个 CPU

process - 处理变更管理的最佳方法是什么?

linux - 长时间后如何通过 bash 脚本 SIGINT 多个后台程序?

linux - 在 Linux 中通过 QProcess 执行 gzip

docker - 我的私有(private)存储库在 curl GET 请求中返回二进制内容