You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查容器中的已打开Shell及当前运行的交互式Shell?

检查容器中已打开的Shell与运行的交互式Shell

嘿,这个问题我之前帮别人排查过好几次,分享几个靠谱的方法给你,不管是查看已打开的Shell,还是确认交互式Shell都能搞定:

一、进入容器直接查看已打开的Shell进程

这是最直接的方式,先进入目标容器(如果已经有Shell连接也可以直接在里面操作):

docker exec -it mycontainer sh

然后用进程查看命令筛选Shell相关进程:

# 列出所有进程并筛选Shell,排除grep自身进程
ps aux | grep -E '(bash|sh|zsh)' | grep -v grep

输出里的每个结果就是容器里已打开的Shell进程,能看到PID、运行用户等关键信息。

二、确认容器中正在运行的交互式Shell

交互式Shell的核心特征是关联了一个终端(TTY),所以我们可以通过TTY字段来快速判断:

  1. 用ps aux查看进程时,重点关注TTY列的内容:

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0   2384   580 ?        Ss   08:00   0:00 sh
    root        10  0.0  0.0   5152  1872 pts/0    Ss   08:05   0:00 sh
    

    这里pts/0就是交互式Shell关联的终端,说明这个进程是通过docker exec -it这类命令启动的;而?表示没有关联终端,通常是容器启动时的默认Shell或者后台运行的进程。

  2. 如果容器里安装了lsof工具,还可以通过查看终端设备来确认:

    lsof | grep /dev/pts
    

    输出中关联到/dev/pts/*设备的Shell进程,就是正在运行的交互式Shell。

三、无需进入容器,在宿主机上直接检查

如果你不想进入容器,也可以在宿主机上操作:

  • 用docker top直接列出容器内的进程并筛选:

    docker top mycontainer | grep -E '(bash|sh|zsh)'
    

    同样可以通过TTY列来判断是否是交互式Shell。

  • 进阶方式:通过容器PID进入命名空间查看
    先获取容器的PID:

    docker inspect -f '{{.State.Pid}}' mycontainer
    

    然后用nsenter进入容器的进程命名空间查看进程(需要宿主机有nsenter工具):

    nsenter -t <容器PID> -p ps aux | grep -E '(bash|sh|zsh)'
    

小提醒

如果容器里没有ps或lsof这类工具,可以先临时安装:

  • Debian/Ubuntu系:apt update && apt install -y procps lsof
  • Alpine系:apk add procps lsof

内容的提问来源于stack exchange,提问作者adamency

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:47:37