• 基于操作系统进程ID,查看该进程是属于哪个docker容器的


    有这么一个场景,在某个运行docker容器的主机上,查看到某个java进程占用的系统资源比较高,比如内存比较高,我们知道了这个进程是容器的进程,那么,我们怎么能够知道,这个进程是属于哪个容器的呢?

     

    下面的命令,就会向你说明,如何在主机上,通过一个操作系统的进程,来获取该进程所在的容器名称······

     

    首先,我们在主机上查看某个进程对应的PID

     

    [root@nccztsjb-node-09 ~]# ps -ef |grep java | grep "/usr/local/java/bin/jav"
    root      5220  5212  3 16:28 ?        00:00:04 /usr/local/java/bin/java -jar tools.jar ymscopy
    root      6741 23869  0 16:30 pts/1    00:00:00 grep --color=auto /usr/local/java/bin/jav
    root      9552  8476  3 Jun23 ?        03:38:10 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms512m -Xmx1792m -Xss8m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=768m -Duser.timezone=GMT+08 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Djava.awt.headless=true -XX:+DisableExplicitGC -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08 -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF8 -Duser.language=Zh -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
    root     16063 16020  4 Jun23 ?        04:21:29 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms512m -Xmx1792m -Xss8m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=768m -Duser.timezone=GMT+08 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Djava.awt.headless=true -XX:+DisableExplicitGC -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08 -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF8 -Duser.language=Zh -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

    左边的第2列,就是获取到进程ID,我们以16063为例子

     

    通过下面的命令,来获取该进程所在的容器的名称

     

    psid=16063   # 这里替换为要查询的进程的PID
    
    for i in $(docker container ls --format "{{.ID}}"); 
    do 
        id_count=$(docker top $i | grep ${psid} | wc -l)
         
        if [[ ${id_count} -gt 0 ]]
          then
            echo -n "$i    "
            docker inspect -f '{{.Name}}' $i | tr -d "/"
        fi
    done

     

    可以看到,在图上标记为红色的部分,就是这个进程所在的容器的名称。

     

    我们可以查,验证下

     

    [root@nccztsjb-node-09 ~]# docker top 2371e32d413f
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                16003               15983               0                   Jun23               ?                   00:00:00            /usr/bin/dumb-init -- entrypoint.sh catalina.sh run
    root                16020               16003               0                   Jun23               ?                   00:00:00            /bin/sh /usr/local/bin/entrypoint.sh catalina.sh run
    root                16063               16020               4                   Jun23               ?                   04:21:34            /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms512m -Xmx1792m -Xss8m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=768m -Duser.timezone=GMT+08 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Djava.awt.headless=true -XX:+DisableExplicitGC -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08 -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF8 -Duser.language=Zh -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
    [root@nccztsjb-node-09 ~]# 

     

    可以确定了,这个进程ID就是属于这个容器,说明我们上面的查询命令没有问题。

     

    PS:知识不是力量······只有可以被运用起来的知识,才会产生力量!

  • 相关阅读:
    plink:将bed文件转化为ped,map文件
    linux下查找某文件关键字(grep 函数)
    genetic model
    linux下设置默认路径
    vi怎么查找关键字
    有意思的undefined columns selected,源于read.table和read.csv
    练习2-2
    练习2-1
    排序算法之堆排序
    Java实现二叉树先序,中序,后序,层次遍历
  • 原文地址:https://www.cnblogs.com/chuanzhang053/p/16416629.html
Copyright © 2020-2023  润新知