账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    docker 容器中如何对 pid 1 的进程进行 coredump?
    30
    0

    问题描述

    背景:线上有一个 golang 写的应用,运行在 docker 容器里,并且使用 cgo 调用了 so 动态库,在周末的时候会因为一些情况发生崩溃,recover 也没有捕捉到,怀疑是 so 的问题,希望通过分析 core 文件找出崩溃的原因。

    所以现在核心问题就是:如何在容器里对 pid 为 1 的进程生成 core 文件?

    自己尝试过哪些方法

    抛开容器,我们知道 Go 应用要在系统里生成 core 文件,需要

    1. 系统支持生成 core - 在当前登录的终端输入 ulimit -c unlimited
    2. 设置存储位置 - echo '/tmp/core.%t.%e.%p' | sudo tee /proc/sys/kernel/core_pattern
    3. 对于 golang 应用,需要在启动时加入环境变量:GOTRACEBACK=crash ...

    对于容器,前两个设定的处理方式:

    1. docker run 加上参数 --ulimit core=-1 --security-opt seccomp=unconfined
    2. 容器会继承宿主机的 /proc/sys/kernel/core_pattern 配置设定,这里选择直接修改宿主机的配置

    触发生成 coredump 的方式,这里选择给进程发送信号,尝试过两种方式

    1. docker exec 进相关容器,执行 kill -SIGQUIT 1
    2. 宿主机上执行 docker kill --signal=SIGQUIT <container_id>

    相关软件的版本

    你期待的结果是什么?实际看到的错误信息又是什么?

    PS:为避免 pid 1 中止导致容器重启,宿主机的某个目录挂载进容器的/tmp目录。

    实际结果是在 /tmp 目录下未产生 core 文件。

    作为对比,我在运行的相同容器内通过 Ctrl + \ 手动中止gops trace 1 又能生成 core 文件(实际是 gops 进程的 core 文件)

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 浪子边城 普通会员 1楼

      在Docker容器中,可以通过使用docker exec命令对PID为1的进程进行Coredump。docker exec命令允许您在后台执行一个进程,并允许您在其执行期间保存状态。以下是一个示例:

      bash docker exec -it your_image_name /bin/bash

      在上述命令中,-it选项告诉Docker执行一个交互式shell(而不是普通的命令行shell)。/bin/bash是您想要运行的shell的路径。

      如果您想要从PID为1的进程中获取核心 dump,您可以使用docker exec命令与docker exec命令结合使用。以下是一个示例:

      bash docker exec -it your_image_name /bin/bash -c "exec /bin/bash"

      在上述命令中,-c "exec /bin/bash"告诉Docker执行/bin/bash命令,而不是交互式shell。这将创建一个新的进程,并在该进程中执行/bin/bash命令。

      请注意,只有在满足特定条件时,Docker才会为PID为1的进程创建一个Coredump。这些条件可能包括但不限于:该进程正在运行,该进程正在使用内存,该进程正在执行CPU密集型操作,或者该进程正在与网络进行通信。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部