如何检查容器中的已打开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字段来快速判断:
用
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或者后台运行的进程。如果容器里安装了
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
相关产品推荐
相关产品推荐

