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

posted @ 2018-08-16 00:07  Surpassme  阅读(558)  评论(0编辑  收藏  举报