• Linux 基础教程 37-进程命令


    pidof

        我们知道每个小孩一出生就会一个全国唯一的编号来对其进行标识,用于以后上学,办社保等,就是我们的身份证号。那么在Linux系统中,用来管理运行程序的标识叫做PID,就是大家熟知的进程ID。那么如何来找到程序的PID了,那么就需要用到命令pidof,其功能主要用来查看运行程序的PID。

    基本用法

    pidof [选项] [程序名]
    

    其常用选项参数如下所示:

    选项 说明
    -s 仅返回一个PID
    -c 仅返回具有相同root目录的PID
    -x 显示由脚本开启的进程
    -o omitpid 忽略指定的PID
    pidof命令的返回值通常只有两个:
    - 0:pidof命令至少找到一个对应的PID
    - 1:pidof没有找到任何匹配的PID
    

    用法示例

    1、显示运行程序的PID

    [root@localhost ~]# pidof sshd
    34128 34059 28835 28820 24697 24627 23228 23215 1995
    

    在显示的结果可以看到共有9个PID,则说明服务器上9个进程均是由sshd启动的。

    2、显示Shell的进程

    [root@localhost ~]# cat test.sh
    #!/bin/bash
    i=1;
    while [ $i -le 10000 ]
    do
     echo $i
     i=$((i+1))
     sleep 120s
    done
    [root@localhost ~]# ./test.sh &
    [root@localhost ~]# pidof -x test.sh
    36554
    

    3、显示指定程序的PID

    [root@localhost ~]# pidof -s sshd
    7524
    

    4、忽略指定的PID

    [root@localhost ~]# pidof sshd
    9104 9103 7524 7434 4474 4462 1995
    [root@localhost ~]# pidof sshd -o 1995
    11979 11978 7524 7434 4474 4462
    

    lsof

        在Windows中删除文件时,会出现被占用而暂时无法删除的情况,这个我们会一款非常好用的软件Unlocker,那么在Linux中类似的情况如何处理了?今天我们来学习lsof命令。
        lsof全称list open files。用于查看进程打开的文件、目录和套接字等信息。

    基本用法

    lsof [选项] [文件名]
    

    其常用选项参数如下所示:

    选项 说明
    -?或-h 显示帮助信息
    -a 显示打开文件存在的进程
    -c 进程名 显示指定进程所打开的文件
    -d FD 显示文件描述符(FD)占用的进程
    +d 目录名 显示当前目录下被打开的文件
    +D 目录名 递归显示当前目录下被打开的文件
    -i 条件 显示符合条件的进程
    -p pid 显示指定PID打开的文件
    -u uid 显示指定UID打开的文件
    -g 显示所属组标识符PGID
    R 显示父进程PPID

    其中选项 -i 支持的条件如下所示:

    条件 说明 示例
    4/6 IPv4/ IPv6 lsof -i
    protocol UDP/TCP lsof -i TCP
    hostname 网络主机名 lsof -i@localhost
    hostaddr 网络地址 lsof -i@192.168.8.8
    service 服务名称,可查看/etc/services lsof -i:ssh
    port 端口 lsof -i:22

    lsof输出的详细信息解释如下:

    • COMMAND:进程名称,如果名称较长,则默认只显示前9个字符
    • PID:进程标识符,如果添加-R参数,则显示父进程PPID
    • USER:进程所有者,如果添加-g参数,则显示组标识符PGID
    • FD:文件描述符
    • TYPE:文件类型,常见类型如下所示:
      DIR:表示目录
      REG:表示普通文件
      CHR:表示字符类型
      BLK:表示块设备类型
      UNIX:表示UNIX套接字
      FIFO:表示先进先出队列
      IPv4:表示IPv4套接字
      IPv6:表示IPv6套接字

    文件描述符FD,但却可以表示两类内容:

    • 第一类是文件描述符
      0:标准输入
      1:标准输出
      2:标准错误输出
      n:其他文件描述符的数值

    01文件描述符.jpg

    • 第二类描述文件特征的标识
      CWD:表示应用程序的当前工作目录,即程序启动的目录
      txt:表示文件类型为程序代码或数据
      mem:内存映射文件
      pd:父目录
      rtd:根目录
      DEL:表示文件已经删除但还存在于内存中

    用法示例

    1、通过文件定位占用的进程

    [root@localhost ~]# top -d 2 > top.txt
    [root@localhost ~]# lsof top.txt
    lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    top     8900 root    1w   REG    8,2    69035 469790741 top.txt
    

    2、通过文件描述符定位进程

    [root@localhost ~]# lsof -d 5 | head -3
    lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
       Output information may be incomplete.
    COMMAND  PID  USER   FD   TYPE      DEVICE SIZE/OFF NODE       NAME
    systemd  1    root   5u   a_inode   0,10     0     7450       [signalfd]
    Xvnc     2678 root   5u   IPv6      41776    0t0   TCP *:6003 (LISTEN)
    

    3、通过进程定位文件

    [root@localhost ~]# ps -ef |grep -i  mysql | grep -v grep
    mysql 2680  1  2 7月19 ?  11:44:50 /usr/libexec/mysqld --basedir=/usr
    [root@localhost ~]# lsof -p 2680 | head -3
    lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
         Output information may be incomplete.
    COMMAND  PID  USER   FD    TYPE  DEVICE SIZE/OFF  NODE   NAME
    mysqld  2680  mysql  cwd   DIR   8,2    4096      319571 /var/lib/mysql
    mysqld  2680  mysql  rtd   DIR   8,2    254       512    /
    

    4、查看用户打开的文件

    [root@localhost ~]# lsof -u root | tail -3
    lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
       Output information may be incomplete.
    COMMAND   PID   USER  FD     TYPE DEVICE  SIZE/OFF NODE NAME
    kworker/3 39337 root  cwd    DIR  8,2     254      512  /
    kworker/3 39337 root  rtd    DIR  8,2     254      512  /
    kworker/3 39337 root  txt   unknown                     /proc/39337/exe
    

    5、查看程序所占用的端口

    [root@localhost ~]# lsof -i:22
    COMMAND PID    USER   FD  TYPE  DEVICE      SIZE/OFF NODE NAME
    sshd    27597  root   3u  IPv4 1460505039   0t0      TCP *:ssh (LISTEN)
    sshd    27597  root   4u  IPv6 1460505041   0t0      TCP *:ssh (LISTEN)
    

    fuser

        fuser主要用于显示进程正在使用的文件、套接字、挂载点等。

    基本用法

    fuser [选项] [文件名]
    

    其常用选项如下所示:

    选项 说明
    -a ,--all 显示命令行中指定的所有文件
    -c 同-m选项,用于兼容POSIX
    -k, --kill 杀掉使用文件的进程
    -i, --interactive 杀掉进程前需要用户确认,如果无-k参数则默认忽略该参数
    -l, --list-signals 显示所有已知的 signal名称
    -m NAME, --mount NAME 指定一个挂载的文件系统或被挂载的设备
    -n SPACE 指定一个不同的命名空间,支持不同的命名空间文件(默认为文件名)、UDP(本地UDP端口)、TCP(本地TCP端口),为避免歧义,可以使用name/space形式,如80/tcp
    -w 仅杀掉拥有写入权限的进程,如果无-k参数则默认忽略该参数
    -s, --silent 静默模式,-u和-v忽略该参数
    -u, --user 在PID后显示所属的用户名
    -v, --verbose 显示详细信息
    -4, --ipv4 仅搜索IPv4的套接字
    -6, --ipv6 仅搜索IPv6的套接字

    fuser显示指定文件或文件系统的进程PID,在默认模式中,每个文件名后面会用一个字母表示访问类型,如下所示:

    • c:表示当前目录
    • e:表示该文件为可执行文件
    • f:表示被打开的文件,默认模式中f不显示
    • F:表示被打开的文件,用于写入操作,默认模式中F不显示
    • r:根目录
    • m:映射文件或共享lib
    -f 和 -F 只有与选项 -v 一起使用的时候才会显示,其他情况则默认不显示
    

    用法示例

    1、杀掉所有占用/home的进程

    [root@localhost ~]# fuser -km /home
    

    2、显示本地所有mysql上端口进程

    [root@localhost ~]# fuser mysql/tcp
    mysql/tcp:            2680
    

    3、显示详细的信息

    [root@localhost ~]# fuser -v top.txt
                         用户     进程号  权限   命令
    /root/top.txt:       root     15847 F....  top
    

    4、查看有多个进程正在使用某个目录下文件系统,包含子目录

    [root@localhost ~]# fuser -v -m /home/data
                         用户     进程号 权限   命令
    /home/data:          root     kernel mount /home/data
    

    5、通过端口定位进程

    [root@localhost ~]# fuser -v -n tcp 22
                         用户     进程号 权限   命令
    22/tcp:              root      27597 F.... sshd
                         root      31119 F.... sshd
    或
    [root@localhost ~]# fuser -v 22/tcp
                         用户     进程号 权限   命令
    22/tcp:              root      27597 F.... sshd
                         root      31119 F.... sshd
    

    fuser与lsof对比

    对比项 fuser lsof
    定位方式 通过文件查找进程 通过进程查找文件
    所属标准 POSIX -
    参数类型 文件/网络端口 文件/PID/网络端口
    进程输出 PID PID详细信息
    是否可发送信息 可以,使用-k 不可以

    ps

        在Windows系统中用于查看进程通常是通过任务管理器。而在Linux中,我们用ps(Process Status)命令来查看进程。

    基本用法

    ps [选项]
    

    其常用选项如下所示:

    选项 说明
    -A 显示所有进程,同选项-e
    -a 显示所有进程,但排除新会话的首进程和无控制终端的进程
    -d 显示所有进程,但排除新会话的首进程
    -e 显示所有进程,同选项-A
    r 仅显示正在运行的进程
    -C cmdlist 显示指定命令的进程信息
    -p pidlist 显示指定PID的进程
    -t ttylist 显示指定tty的进程
    -u userlist 显示指定有效用户ID或名字的进程
    -c 显示CLS和PRI列
    -f 添加详细列信息,通常与其他选项联合使用
    -x 没有关联到终端上的进程也进行显示
    -o 仅显示自定义的列
    -l 仅显示属于当前登录用户的PID与相关信息列表
    --sort spec 对输出信息进行排序 + 升序排序 - 降序排序

    用法示例

    1、不带参数的示例

    [root@localhost ~]# ps
      PID TTY          TIME CMD
    11047 pts/0    00:00:00 ps
    24892 pts/0    00:00:00 su
    25142 pts/0    00:00:00 bash
    

    2、仅显示与当前用户相关的进程和相关信息

    [root@localhost ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 R     0 22720 25142  0  80   0 - 38292 -      pts/0    00:00:00 ps
    4 S     0 24892 22641  0  80   0 - 58599 do_wai pts/0    00:00:00 su
    4 S     0 25142 24892  0  80   0 - 29305 do_wai pts/0    00:00:00 bash
    
    • F:表示进程标志,说明当前进程的权限,若为4表示进程权限为root,若为1表示些子进程仅可进行复制(fork)而无法实际运行
    • S:表示进程状态,主要状态有:
        R:进程正在运行
        S:进程处于睡眠状态,但可以被唤醒
        D:进程处于不可被唤醒的睡眠状态,通常该进程可能在等待I/O
        T:停止状态,可能是在工作控制或除错状态
        Z:僵尸状态,进行已经终止但却无法释放内存等
    • UID/PID/PPID:进行的所属UID/PID/PPID
    • C:CPU使用率,单位为%
    • PRI/NI:Priority/Nice缩写,表示进程被CPU执行的优先级,数值越小越快被CPU执行
    • ADDR:与内存相关,ADDR表示该进程在内存的哪个部分,如果是Running进程,会显示 -
    • SZ:与内存相关,表示该进程使用了多少内存;
    • WCHAN:与内存相关,表示该进程目前是否正在运行,-表示正在运行中
    • TTY:启动进程的终端名称
    • TIME:进程的实际CPU占用时间之和,单位为秒
    • CMD:进程命令

    3、查看系统所有进程

    [root@localhost ~]# ps aux
    USER PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root   2  0.0  0.0      0     0 ?        S    8月08   0:00 [kthreadd]
    root   3  0.0  0.0      0     0 ?        S    8月08   0:03 [ksoftirqd/0]
    root   5  0.0  0.0      0     0 ?        S<   8月08   0:00 [kworker/0:0H]
    root   8  0.0  0.0      0     0 ?        S    8月08   0:00 [migration/0]
    
    • USER:进程所属用户
    • PID:进程标识符
    • %CPU:进程的CPU占比
    • %MEM:进程物理内存占比
    • VSZ:进程虚拟内存(KB)使用量
    • RSS:进程占用的固定内存量(KB)
    • TTY:启动进程的终端名称
    • STAT:进程状态
    • START:进程启动时间
    • TIME:进程的实际CPU占用时间之和
    • COMMAND:进程命令

    在Linux中ps通常有三种不同的书写格式

    • BSD格式:选项前不加短横线 - ,多个选项可以组合使用如ps aux
    • UNIX格式:选项前加短横线 -,多个选项可以组合使用如ps -aux
    • GNU长格式:选项前加双短横线 --,如 ps --context

    因此ps aux 和ps -aux 在显示的输出信息是一样的。

    4、显示自定义列

    [root@localhost ~]# ps -eo pid,user,cmd
    PID USER     CMD
      2 root     [kthreadd]
      3 root     [ksoftirqd/0]
      5 root     [kworker/0:0H]
      8 root     [migration/0]
    

    5、对输出结果进行排序

    [root@localhost ~]# ps -ef --sort=uid,-ppid,+pid
    UID  PID    PPID  C STIME TTY        TIME CMD
    root 31637 31624  0 17:42 pts/1  00:00:00 less -s
    root 40772 25142  0 17:44 pts/0  00:00:00 ps -ef --sort=uid,-ppid,+pid
    root 40773 25142  0 17:44 pts/0  00:00:00 more
    root 25142 24892  0 15:32 pts/0  00:00:00 bash
    root 31624 24164  0 17:42 pts/1  00:00:00 man ps
    root 24164 23955  0 15:32 pts/1  00:00:00 bash
    root 23955 23586  0 15:32 pts/1  00:00:00 su root
    root 24892 22641  0 15:32 pts/0  00:00:00 su root
    

    pstree

        在使用ps查看进程十分方便,但若想查看详细进程和子进程时,则需要使用pstree全命令。由于pstree不是系统自带,需要自行安装

    yum -y install pstree
    

    基本语法

    pstree [选项]
    

    常用选项如下所示:

    选项 说明
    -a 显示每个进程的完整指令,包括路径、参数等
    -h 高亮显示当前进程及父进程
    -g 显示PGID
    -n 相同父进程下,按各自的PID进行排序
    -p 显示PID
    -s 显示父进程
    -u username 显示UID信息

    kill

        在Windows系统中,当某个一个程序出现假死或无反应时,我们常常打开任务管理器,找到对应的进程,然后杀掉该进程。在命令行盛行的Linux中,我们该使用哪个命令?常用于杀掉进程的命令非kill莫属了。

    基本用法

    kill [选项] [PID]
    

    其常用选项如下所示:

    选项 说明
    -s signal 向目标进程发送指定的信号类型,信号可以为名称或数字
    -l 显示信号名称列表,如果在-l加编号则查看信号名称,反之亦然
    -a 处理当前进程时,不限制命令和PID的对应关系
    -p 指定kill命令仅显示相关进程的进程号,而不发送任何信号
    • 无选项:表示向目标进程发送默认的终止信号,即SIGTERM
    • PID>0:表示向目标进程发送信号,此处的PID可以是多个PID,用空格进行分隔
    • PID=0:表示向当前进程组的所有进程发送信号
    • PID=-1:表示向除当前 kill 进程和 init 进程之外的所有进程发送信号
    • PID<-1:表示向进程组PGID的所有进程发送信号,如-123,则向进程组PGID为123的所有进程发送信号

    用法示例

    1、显示信号列表
    02信号列表.jpg

    除以上显示信号,还有一个特殊的编号0为测试信号,其作用如下:

    • 用于测试目标进程是否存在
    [root@localhost ~]# kill -l 0
    T
    [root@localhost ~]# kill -0 99999
    bash: kill: (99999) - 没有那个进程
    
    • 用于测试当前用户是否拥有向该进程发送信号的权限
    [admin@localhost ~]# kill -0 2325
    bash: kill: (2325) - 操作不被允许
    

    2、查看信号对应的编号或名称

    [root@localhost ~]# kill -l SIGHUP
    1
    [root@localhost ~]# kill -l KILL
    9
    [root@localhost ~]# kill -l 9
    KILL
    

    在Linux中常用信号如下所示:

    信号名称 编号 解释
    HUP 1 终端断线
    INT 2 中断(同Ctrl+C)
    QUIT 3 退出(同Ctrl+)
    KILL 9 强制终止
    TEEM 15 终止
    CONT 18 继续(与STOP相反)
    STOP 19 暂停(同Ctrl+Z)

    3、强制终止进程

    [root@localhost ~]# kill -9 26744
    [root@localhost ~]# kill -kill 30470
    

    在使用kill -9需要注意的事项如下所示:

    • kill不能杀死进程为1的init进程
    • 在使用kill -9时是强行终止进程且没有通知目标进程进行自我清理,而是突然被中止,可以造成资源无法正常释放,数据无法同步到磁盘等,在使用前需要三思

    本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:
    MyQRCode.jpg

  • 相关阅读:
    2020 CCF CSP-J2(表达式)
    PSP总结报告
    第十三周例行报告
    对团队成员公开感谢博客
    作业要求 20181127-1 附加作业 软件工程原则的应用实例分析
    第十二周例行报告
    第十一周例行报告
    第十周例行报告
    第八周例行报告
    第七周例行报告
  • 原文地址:https://www.cnblogs.com/surpassme/p/9484794.html
Copyright © 2020-2023  润新知