文章目录

  • 一、定时任务crontab实现每秒执行
  • 二、进程
    • (一)Linux程序与进程
      • 1.程序和进程的区别
      • 2.进程和线程的区别
      • 3.父子进程的关系
  • 三、进程管理工具
    • (一)ps命令
    • (二)pstree
    • (三)top命令
    • (四)pgrep
    • (五)kill
    • (六)killall
    • (七)pkill
  • 四、查看系统资源的使用状况vmstat

一、定时任务crontab实现每秒执行

1.使用延时来实现每N秒执行(sleep SECOND)

[root@admin ~]# crontab -e  #在当前用户的计划任务中写入
#延时10s执行的任务
* * * * *  /usr/bin/echo "this is a test ...`date "+%F+%T"`" >> /root/test
* * * * * sleep 10; /usr/bin/echo "this is a test ...`date "+%F+%T"`" >> /root/test
* * * * * sleep 20; /usr/bin/echo "this is a test ...`date "+%F+%T"`" >> /root/test
* * * * * sleep 30; /usr/bin/echo "this is a test ...`date "+%F+%T"`" >> /root/test
* * * * * sleep 40; /usr/bin/echo "this is a test ...`date "+%F+%T"`" >> /root/test
* * * * * sleep 50; /usr/bin/echo "this is a test ...`date "+%F+%T"`" >> /root/test

使用 tail -f 查看执行情况,可以见到test文件每10秒被写入一条记录

[root@admin ~]# tailf /root/test
this is a test ...2020年 10月 26日 星期一 18:03:01 CST
this is a test ...2020年 10月 26日 星期一 18:03:11 CST
this is a test ...2020年 10月 26日 星期一 18:03:21 CST
this is a test ...2020年 10月 26日 星期一 18:03:31 CST
this is a test ...2020年 10月 26日 星期一 18:03:41 CST
this is a test ...2020年 10月 26日 星期一 18:03:51 CST
this is a test ...2020年 10月 26日 星期一 18:04:01 CST

原理:通过延时方法 sleep N 来实现每N秒执行

注意:60必须能整除间隔的秒数(没有余数),例如间隔的秒数是2,4,6,10,12等

如果间隔的秒数太少,例如2秒执行一次,这样就需要在crontab 加入60/2=30条语句。不建议使用此方法,可以使用下面介绍的第二种方法。

2.编写shell脚本实现

#编写脚本使用循环实现每两秒向test1文件写入信息
[root@admin ~]# vim crontab.sh
#!/bin/bash
SEC=2 #间隔的秒数,不能大于60
for (( i = 0; i < 60; i=(i+SEC) )); doecho "this is a test ...`date "+%F+%T"`" >> /root/test1sleep $SEC
done
exit 0
:wq
#将写好的脚本放入计划任务中进行每分钟执行
[root@admin ~]# crontab
* * * * * /usr/bin/sh /root/crontab.sh
[root@admin ~]# tailf /root/test1
this is a test ...2020-10-26+18:10:08
this is a test ...2020-10-26+18:10:10
this is a test ...2020-10-26+18:10:12
this is a test ...2020-10-26+18:10:14
this is a test ...2020-10-26+18:10:16
this is a test ...2020-10-26+18:10:18

原理:在sh使用for语句实现循环指定秒数执行(也可以使用其他循环)

注意:如果60不能整除间隔的秒数,则需要调整执行的时间。例如需要每7秒执行一次,就需要找到7与60的最小公倍数,7与60的最小公倍数是420(即7分钟)。

则 crontab.sh step的值为7,循环结束条件i<420, crontab -e可以输入以下语句来实现

*/7 * * * * /usr/bin/sh /root/crontab.sh

二、进程

(一)Linux程序与进程

程序是一组指令及参数的集合,按照既定的逻辑控制计算机运行用来完成特定任务

进程则是运行着的程序,是操作系统执行的基本单位,是程序运行的过程, 动态。有生命周期及运行状态

  • 从用户的角度来看进程是程序的一次动态执行过程。
  • 从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。
  • 进程是资源分配的最小单位。
  • 每一个进程都有自己独立的地址空间与执行状态。
  • 像Linux这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程。

1.程序和进程的区别

  • 程序是静态的,它只是一组指令的集合,不具有任何的运行意义。而进程是程序运行的动态过程
  • 进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程
  • 进程还具有并发性和交往性,而程序却是封闭的

2.进程和线程的区别

  • 一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行
  • 线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行

进程生命周期

父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID(PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代:

  • Centos5/6: init
  • Centos7: systemd

3.父子进程的关系

子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程 在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。 父进程终止子进程自终止。

子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。

三、进程管理工具

(一)ps命令

ps 命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息

用法: ps [选项]

选项:

  • -A:所有的进程均显示出来,与 -e 具有同样的效用;
  • -a: 只显示现行终端机下的所有进程,包括其他用户的进程;
  • a:显示一个终端的所有进程,除会话引线外;
  • -u:以用户为主的进程状态 (也可不加-)
  • x:显示没有控制终端的进程;
  • -e:显示所有进程

输出格式选项:

  • l :较长、较详细的将该PID 的的信息列出(也可不加-)
  • j :工作的格式 (jobs format)
  • -f :做一个更为完整的输出。

可以看到,ps 命令有些与众不同,它的部分选项不能加入"-",比如命令"ps aux",其中"aux"是选项,但是前面不能带“-”

执行 “man ps” 命令,则会发现 ps 命令的帮助为了适应不同的类 UNIX 系统,可用格式非常多,不方便记忆。所以,建议大家记忆几个固定选项即可。比如:

  • ps aux 可以查看系统中所有的进程;
  • ps -le 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
  • ps -l 只能看到当前 Shell 产生的进程;

其实有这三个命令就足够了

【例 1】

ps aux 查看系统中所有的进程

[dxk@admin ~]$ ps -aux
#查看系统中的所有进程
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.2  0.3 128000  6660 ?        Ss   09:16   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    09:16   0:00 [kthreadd]
root          3  0.1  0.0      0     0 ?        S    09:16   0:02 [kworker/0:0]
root          4  0.0  0.0      0     0 ?        S<   09:16   0:00 [kworker/0:0H]
root          5  0.0  0.0      0     0 ?        S    09:16   0:00 [kworker/u256:0]
root          6  0.0  0.0      0     0 ?        S    09:16   0:00 [ksoftirqd/0]
…省略部分输出…

说明以上输出信息中各列的具体含义:

表头 含义
USER 该进程是由哪个用户产生的
PID 进程的ID
%CPU 该进程占用CPU资源的百分比,占用的百分比越高,进程越耗费资源
%MEM 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源
VSZ 该进程占用虚拟内存的大小,默认单位为KB
RSS 该进程占用实际物理内存的大小 ,默认单位为KB
TTY 该进程是在哪个终端上运行的。其中tty1~tty7代表本地控制台终端(tty7是图形化终端),pts0—pts255代表伪终端,一般是远程连接的终端
STAT 进程状态。-Z:僵尸进程;-S:该进程处于睡眠状态,可被唤醒;-D:不可被唤醒的睡眠状态;-R:该进程正在运行…
START 该进程启动的时间
TIME 该进程占用CPU的运算时间,而不是系统时间
COMMAND 产生此进程的的命令名

【例 2】

ps -le 命令也能看到系统中所有的进程。由于 “-l” 选项的作用,所以 ps -le命令能够看到更加详细的信息,比如父进程的 PID、优先级等。但是这两个命令的基本作用是一致的

[dxk@admin ~]$ ps -le
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 - 32000 ep_pol ?        00:00:03 systemd
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      3      2  0  80   0 -     0 worker ?        00:00:03 kworker/0:0
1 S     0      4      2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H
1 S     0      5      2  0  80   0 -     0 worker ?        00:00:00 kworker/u256:0
……省略部分输出信息……

说明以上输出信息中各列的具体含义:

表头 含义
F 进程标志,说明进程的权限,常见的标志有两个。1:进程可以被复制,但不能执行 4:进程使用超级用户权限
S 进程状态,和ps aux命令输出内容中的STAT一致
UID 运行此进程的用户ID
PID 进程的ID
PPID 父进程的ID
C 该进程的CPU使用率,单位是百分比
PRI 进程的优先级,数值越小该进程的优先级越高,越早被CPU执行
NI Nice值, 可通过修改其值调整进程的优先级
ADDR 该进程在内存的哪个位置
SZ 该进程占用的内存大小
WCHAN 该进程是否在运行。“-”代表在运行
TTY 该进程在哪个终端上个运行
TIME 该进程占用CPU的时间,不是系统时间
CMD 产生此进程的命令名

【例 3】如果不想看到所有的进程,只想查看一下当前shell产生了哪些进程,那只需使用 “ps -l” 命令就足够了

[dxk@admin ~]$ ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000   1640   1639  0  80   0 - 28917 do_wai pts/1    00:00:00 bash
0 R  1000   1735   1640  0  80   0 - 38337 -      pts/1    00:00:00 ps

可以看到,是在 pts/1 伪终端登录,且只产生了两个进程:一个是登录之后生成的 Shell,也就是 bash;另一个是正在执行的 ps 命令

【例 4】
查找指定进程的指定信息并进行排序

[root@admin ~]# ps axo pid,command,pri,nice --sort=pri | grep httpd2068 /usr/sbin/httpd -DFOREGROUN  19   02071 /usr/sbin/httpd -DFOREGROUN  19   02072 /usr/sbin/httpd -DFOREGROUN  19   02073 /usr/sbin/httpd -DFOREGROUN  19   02074 /usr/sbin/httpd -DFOREGROUN  19   02075 /usr/sbin/httpd -DFOREGROUN  19   025496 grep --color=auto httpd      19   0

僵尸进程的产生一般是由于进程非正常停止或程序编写错误,导致子进程先于父进程结束,而父进程又没有正确地回收子进程,从而造成子进程一直存在于内存当中,这就是僵尸进程。僵尸进程会对主机的稳定性产生影响,所以,在产生僵尸进程后,一定要对产生僵尸进程的软件进行优化,避免一直产生僵尸进程;对于已经产生的僵尸进程,可以在查找出来之后强制中止

(二)pstree

以树形结构显示程序和进程之间的关系(即哪个进程是父进程,哪个是子进程)

用法: pstree [options] [ PID | USER ]

选项:

  • -A::各进程树之间的连接以ASCII码字符来连接
  • -U:各进程树之间的连接以utf8字符来连接,某些终端可能会有错误
  • -p:同时列出每个进程的PID
  • -u:同时列出每个进程的所属账号名称
  • -a :显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
  • -c :不使用精简法显示进程信息,即显示的进程中包含子进程和父进程
  • -n :根据进程 PID 号来排序输出,默认是以程序名排序输出的。

需要注意的是:
在使用 pstree 命令时,如果不指定进程的 PID 号,也不指定用户名称,则会以systemd进程为根进程,显示系统中所有程序和进程的信息;反之,若指定 PID 号或用户名,则将以 PID 或指定命令为根进程,显示 PID 或用户对应的所有程序和进程。

【例 1】

[root@admin ~]# pstree -p
systemd(1)─┬─NetworkManager(954)─┬─{NetworkManager}(961)│                     └─{NetworkManager}(965)├─VGAuthService(914)├─agetty(938)├─atd(929)├─auditd(890)───{auditd}(891)├─crond(930)───crond(18213)───sh(18217)───sleep(18249)├─dbus-daemon(916)───{dbus-daemon}(920)├─dmeventd(830)─┬─{dmeventd}(857)│               ├─{dmeventd}(858)│               └─{dmeventd}(869)├─firewalld(946)───{firewalld}(1076)├─lvmetad(595)───{lvmetad}(862)├─ping(15120)├─polkitd(923)─┬─{polkitd}(937)│              ├─{polkitd}(939)│              ├─{polkitd}(940)│              ├─{polkitd}(941)│              ├─{polkitd}(942)│              └─{polkitd}(944)├─rsyslogd(1250)─┬─{rsyslogd}(1257)│                └─{rsyslogd}(1258)├─sshd(1249)─┬─sshd(2060)───bash(2064)│            └─sshd(2099)───bash(2103)───pstree(18250)├─systemd-journal(578)├─systemd-logind(927)├─systemd-udevd(612)├─tuned(1248)─┬─{tuned}(1415)│             ├─{tuned}(1416)│             ├─{tuned}(1418)│             └─{tuned}(1420)└─vmtoolsd(915)

【例 2】
查看指定用户或PID启动的进程

[root@admin ~]# pstree   dxk
sshd───bash─┬─ping└─top
[root@admin ~]# pstree -p 1249
sshd(1249)─┬─sshd(2060)───bash(2064)├─sshd(2099)───bash(2103)───pstree(14995)└─sshd(14709)───sshd(14717)───bash(14718)

(三)top命令

实时监控系统处理器状态的命令 top

ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。

为此,Linux 提供了 top 命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。

通过top命令查看系统的CPU、内存、运行时间、交换分区、执行的线程等信息。通过top命令可以有效的发现系统的缺陷出在哪里。是内存不够、CPU处理能力不够、IO读写过高…

用法: top [选项]

选项:

  • -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
  • -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
  • -n 次数:指定 top 命令执行的次数。一般和"-"选项合用;
  • -p 进程PID:仅查看指定 ID 的进程;
  • -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
  • -u 用户名:只监听某个用户的进程;
  • -o [+/-] fieldname:以表头的某个选项排序,+代表所有进程根据该选项从大到小排序(+是默认的),-代表从小到大排序)

在 top 命令的显示窗口中,还可以使用如下按键,进行交互操作:

  • ? 或 h:显示交互模式的帮助;
  • P:按照 CPU 的使用率排序,默认就是此选项;
  • M:按照内存的使用率排序;
  • N:按照 PID 排序;
  • T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
  • k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
  • r:按照 PID 给某个进程重设优先级(Nice)值;
  • q:退出 top 命令;

我们看看 top 命令的执行结果,如下:

top - 10:29:47 up  1:13,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 131 total,   1 running, 130 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1863040 total,  1527264 free,   192192 used,   143584 buff/cache
KiB Swap:  3907580 total,  3907580 free,        0 used.  1519428 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                       1916 dxk       20   0  162116   2256   1580 R   0.3  0.1   0:00.10 top                                                                           1 root      20   0  128000   6660   4144 S   0.0  0.4   0:03.26 systemd                                                                       2 root      20   0       0      0      0 S   0.0  0.0   0:00.03 kthreadd                                                                      3 root      20   0       0      0      0 S   0.0  0.0   0:07.92 kworker/0:0                                                                   4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                                  5 root      20   0       0      0      0 S   0.0  0.0   0:00.44 kworker/u256:0                                                                6 root      20   0       0      0      0 S   0.0  0.0   0:00.18 ksoftirqd/0                                                                   7 root      rt   0       0      0      0 S   0.0  0.0   0:00.70 migration/0                                                                   8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh         ……省略部分输出……

说明输出的内容:

top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。命令的输出主要分为三部分:

  1. 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的;

  2. 第二部分是第六行,提供人机交互;

  3. 第三部分从第七行开始,显示的是系统中进程的信息;

第一部分信息的含义:

第一行为任务队列信息

内容 说明
10:29:47 当前系统时间
up 1:13 系统的运行时间。本机以运行1小时13分钟
2 users 当前登录了两个用户
load average: 0.00, 0.01, 0.05 系统在之前1分钟、5分钟、15分钟的CPU平均负载(这个平均负载一般认为不应该超过服务器 CPU 的核数)

第二行为进程信息

内容 说明
Tasks: 131 total 系统中的进程总数
1 running 正在运行的进程数
130 sleeping 睡眠的进程数
0 stopped 正在停止的进程数
0 zombie 僵尸进程数

第三行为CPU信息

内容 说明
%Cpu(s) CPU百分比
0.1 us 用户模式占用的CPU百分比
0.1 sy 系统模式占用的CPU百分比
0.0 ni 修改过优先级的用户进程占用的CPU百分比
99.8 id CPU空闲时间占用CPU总时间的百分比
0.0 wa 等待I/O的进程占用的CPU百分比
0.0 hi 硬中断请求服务占用的CPU百分比
0.0 si 软中断请求服务占用的CPU百分比
0.0 st st(steal time)意为虚拟时间百分比。被hypervisor(虚拟化层,虚拟机监控器)偷去的时间,实现虚拟化的程序占用CPU时间的百分比

第四行为物理内存信息

内容 说明
KiB Mem : 物理内存信息,单位:KB
1863040 total 物理内存的总量
1527264 free 空闲的物理内存大小
192192 used 已经使用的物理内存大小
143584 buff/cache 缓冲区/缓存的物理内存大小

第五行为交换(swap)分区信息

内容 说明
KiB Swap 交换分区(虚拟内存)信息,单位:KB
3907580 total 交换分区的总大小
3907580 free 空闲交换分区的大小
0 used 已经使用的交换分区的大小
1519428 avail Mem 可以使用的交换分区大小(一般近似为交换分区总大小的30%)

可以使用cat /proc/sys/vm/swappinessx来查看可以使用的交换分区大小的百分比:

[root@admin ~]# cat /proc/sys/vm/swappiness
30

通过 top 命令的第一部分就可以判断服务器的健康状态。如果 CPU 是单核的, 1 分钟、5 分钟、15 分钟的平均负载高于 1,则证明系统压力较大。如果 CPU 的使用率过高或空闲率过低,则证明系统压力较大。如果物理内存的空闲内存过小,则也证明系统压力较大。

这时,我们就应该判断是什么进程占用了系统资源。如果是不必要的进程,就应该结束这些进程;如果是必需进程,那么我们该増加服务器资源(比如増加虚拟机内存)等

缓冲(buffer)和缓存(cache)的区别:

  • 缓存(cache) 是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
  • 缓冲区(buffer) 是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。

top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:

内容 说明
PID 进程的 ID
USER 该进程所属的用户
PR 优先级,数值越小优先级越高,越先被CPU执行
NI Nice值,数值越小、优先级越高
VIRT 该进程使用的虚拟内存的大小,单位为 KB
RES 该进程使用的物理内存的大小,单位为 KB
SHR 共享内存大小,单位为 KB
S 进程状态
%CPU 该进程占用 CPU 的百分比
%MEM 该进程占用内存的百分比
TIME+ 该进程共占用的 CPU 时间
COMMAND 进程的命令名

这部分和 ps 命令的输出比较类似,只是如果在终端执行 top 命令,则不能看到所有的进程,而只能看到占比靠前的进程

【例 1】

如果只想让 top 命令查看某个进程,就可以使用 “-p 选项”。命令如下:

[dxk@admin ~]$ top -p 1639
#只查看PID为1639的进程信息
top - 11:20:10 up  2:03,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1863040 total,  1527908 free,   191528 used,   143604 buff/cache
KiB Swap:  3907580 total,  3907580 free,        0 used.  1520080 avail Mem PID USER      PR  NI    VIRT    RES   SHR  S  %CPU %MEM     TIME+  COMMAND
1639 dxk      20   0   158928   2464  1100 S  0.0  0.1    0:01.50   sshd

【例 2】

top 命令如果不正确退出,则会持续运行。在 top 命令的交互界面中按 “q” 键会退出 top 命令;也可以按 “?” 或 “h” 键得到 top 命令交互界面的帮助信息。在帮助信息中可以看到更多的在交互界面对应按键功能和作用,这里只介绍几个比较常用的:
(1)【k】键:可以终止某个进程

Tips:输入错误,想退格删除,可以使用【Ctrl+Backspace】组合键进行删除

输入你想要终止的进程号,回车后在该交互行会出现以下信息:


此时是top 命令提示我们输入信号(信号 9 代表强制中止,15代表正常终止),回车执行(不输入直接执行为默认正常终止,因为该进程是系统进程正常终止是不行的必须强制终止)
【例 3】

指定 top 命令每隔1秒更新(默认是 3 秒)

[dxk@admin ~]$ top -d 1

【例 4】

指定 top 命令更新3次后就退出

[dxk@admin ~]$ top -n 3

【例 5】

指定 top 命令只显示dxk用户的进程信息(伪用户也可以)

[dxk@admin ~]$ top -u dxk
#伪用户
[dxk@admin ~]$ top -u apache

【例 6】

查看看指定进程(PID)的信息

[dxk@admin ~]$ top -p 1734

【例 7】

将进程按照表头项中的任何一个进行排序显示

#将各进程信息按照使用物理内存大小从大到小排序显示
[dxk@admin ~]$ top -o RES  #等价于 top -o +RES
##将各进程信息按照优先级从小到大排序显示
[dxk@admin ~]$ top -o -PR

【例 8】

如果在操作终端执行 top 命令,则并不能看到系统中所有的进程,默认看到的只是 CPU 占比靠前的进程。如果我们想要看到所有的进程,则可以把 top 命令的执行结果重定向到文件中。不过 top 命令是持续运行的,这时就需要使用 “-b” 和 “-n” 选项。
具体命令如下:

[dxk@admin ~]$ top -b -n 1 > /home/dxk/top.log
#让top命令只执行一次,然后把执行结果重定向到top.log文件中,这样就能看到所有的进程

(四)pgrep

经常要查看进程的信息,包括进程是否已经消亡,通过pgrep来获得正在被调度的进程的相关信息。pgrep通过匹配其进程名,找到匹配的进程

用法: pgrep [options]

选项:

  • -l : 同时显示进程名和PID
  • -o : 当匹配多个进程时,显示进程号最小的那个
  • -n : 当匹配多个进程时,显示进程号最大的那个
    注:进程号越大,并不一定意味着进程的启动时间越晚

【例 1】
默认只显示PID

[root@admin ~]# pgrep httpd
18667
18670
18671
18672
18673
18674

同时显示PID和进程名称

[root@admin ~]# pgrep -l httpd
18667 httpd
18670 httpd
18671 httpd
18672 httpd
18673 httpd
18674 httpd

【例 2】
当匹配多个进程时,显示进程号最小的那个

[root@admin ~]# pgrep -l -o httpd
18667 httpd

当匹配多个进程时,显示进程号最大的那个

[root@admin ~]# pgrep -l -n httpd
18674 httpd

pgrep命令用来查找进程的信息,通常会和kill命令来连用,在指定条件下kill问题进程。

(五)kill

kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。

执行原理: kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。kill命令是通过向进程发送指定的信号来结束相应进程的。

用法: kill [-SIGNAL] PID

选项:

  • -l [SIGNAL]: 查询指定信号(信号编号)的信号编号(信号),若使用“-l”参数会列出全部的信号名称
  • -p :指定kill 命令只打印相关进程的进程号,而不发送任何信号
  • -SIGNAL :指定发送信号

kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。Linux 定义了几十种不同类型的信号,可以使用 kill -l 命令查看所有信号及其编号

[root@admin ~]# kill -l1) SIGHUP     2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP6) SIGABRT    7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

常用信号:

信号编号 信号名 含义
0 EXIT 程序退出时收到该信息
1 HUP 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化
2 INT 表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号。
3 QUIT 退出
9 KILL 杀死进程,即强制结束进程
11 SEGV 段错误
15 TERM 正常结束进程,是 kill 命令的默认信号

说明:只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略

Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用 ps/pidof/pstree/top 等工具获取进程PID,然后使用kill命令来杀掉该进程

在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。

【例 1】
查询信号

[root@admin ~]# kill -l 1
HUP
[root@admin ~]# kill -l HUP
1
[root@admin ~]# kill -l kill
9
[root@admin ~]# kill -l term
15

列出所有信号所对应的信号编号:

[root@admin ~]# kill -l

【例 2】
向进程发送特定的信号

结束进程

[root@admin ~]# ping baidu.com > /dev/null &
[1] 21189
[root@admin ~]# jobs
[1]+  运行中               ping baidu.com > /dev/null &
[root@admin ~]# kill -2 21189
[root@admin ~]# jobs
[1]+  完成                  ping baidu.com > /dev/null

它的效果等同于在前台运行PID为21189的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号

强行终止进程

[root@admin ~]# java HelloWorld >/dev/null &
[1] 21014
[root@admin ~]# jobs
[1]+  运行中               java HelloWorld > /dev/null &
[root@admin ~]# kill -9 21014
[root@admin ~]# jobs
[1]+  已杀死               java HelloWorld > /dev/null

【例 3】

kill命令可以带信号编号选项,也可以不带。如果没有信号编号,kill命令就会默认发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源

[root@admin ~]# pgrep -n httpd
19307
[root@admin ~]# kill 19307 #其实就等价于kill -15 19307

【例 4】

kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息

[root@admin ~]# ping baidu.com > /dev/null &
[1] 21393
[root@admin ~]# su - dxk
[dxk@admin ~]$ kill -9 21393
-bash: kill: (21393) - 不允许的操作

【例 5】
向多个进程发信号或终止它们

[root@admin ~]#  ping baidu.com > /dev/null &
[1] 21687
[root@admin ~]# jobs   #一个PID为21687的后台进程正在运行中
[1]+  运行中               ping baidu.com > /dev/null &
[root@admin ~]# pgrep httpd    #查询进程名为 httpd 的所有PID
18667
18670
18671
18672
18673
20515
[root@admin ~]# kill -2 18667 21687    #同时给两个进程发送结束信号
[root@admin ~]# jobs   #后台进程运行结束
[1]+  完成                  ping baidu.com > /dev/null
[root@admin ~]# pgrep httpd        #httpd所有进程也结束
[root@admin ~]#

可以看到所有httpd进程竟然都结束了,一般而言相同程序名的进程号中最小的是父进程,其余为子进程,结束了父进程那么自然而然子进程也就必须结束

【例 6】

当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下
Enter键使shell的命令提示符再次出现时,才会显示出来

[root@admin ~]# kill -9 22030
[root@admin ~]#
[1]+  已杀死               ping baidu.com > /dev/null

(六)killall

killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程

使用kill命令杀死指定PID的进程时,首先需要在杀死之前使用 ps、pstree、top 等命令再配合grep来查找进程,而killall把这两个过程合二为一

用法: killall [选项] [信号] 进程名

选项:

  • -u: 杀死指定用户的所有进程
  • -I: 忽略小写
  • -g: 杀死进程组而不是进程
  • -i: 交互模式,杀死进程前先询问用户
  • -l: 列出所有的已知信号名称
  • -q: 不输出警告信息
  • -s [SIGNAL] : 发送指定的信号,等价于 -SIGNAL
  • -v: 报告信号是否成功发送
  • -w: 等待进程死亡

此命令的信号类型和使用同 kill 命令

【例 1】
杀死指定用户进程

[root@admin ~]# pstree -p dxk
sshd(1914)───bash(1915)─┬─ping(1950)└─top(1970)
[root@admin ~]# killall -u dxk
[root@admin ~]# pstree -p dxk
未发现进程。

【例 2】
忽略大小写

[root@admin ~]# pgrep httpd
2183
2186
2187
2188
2189
2190
[root@admin ~]# killall -I HtTPd
[root@admin ~]# pgrep httpd

【例 3】
交互式

[root@admin ~]# killall -i httpd
杀死 httpd(2434) ? (y/N) y
杀死 httpd(2435) ? (y/N) y

【例 4】
发送信号

[root@admin ~]# ping baidu.com > /dev/null &
[1] 2593
[root@admin ~]# pstree 2593 #查看PID所对应的进程名
ping
[root@admin ~]# killall -2 ping
[1]+  完成                  ping baidu.com > /dev/null
#也可写成:killall -s 2 ping

【例 5】

[root@admin ~]# killall -2 -v ping
ping(2873) 被信号 2 杀死
[1]+  完成                  ping baidu.com > /dev/null

【例 6】

[root@admin ~]# killall -2 test
test: no process found
[root@admin ~]# killall -2 -q test #即使进程不存在也不输出警告信息

【例 7】

[root@admin ~]# killall -w -v ping
ping(3042) 被信号 15 杀死
[1]+  已终止               ping baidu.com > /dev/null

(七)pkill

pkill是ps命令和kill命令的结合,按照进程名来发送指定信号给进程,pkill和killall应用方法差不多

用法: pkill [SIGNAL] 进程名

信号和kill及killall相同

【例 1】
发送指定信号(同 killall )

[root@admin ~]# ping baidu.com > /dev/null &
[1] 3931
[root@admin ~]# pkill -2 ping
[1]+  完成                  ping baidu.com > /dev/null

【例 2】
pkill命令踢出登陆用户,即按照终端号来踢出用户登录

[-t 终端号] 选项用于按照终端号踢出用户

通过 killall 命令杀死 sshd 进程的方式来踢出用户,非常容易误杀死进程,要么会把 sshd 服务杀死,要么会把自己的登录终端杀死。

所以,不管是使用 kill 命令按照 PID 杀死登录进程,还是使用 killall 命令按照进程名杀死登录进程,都是非常容易误杀死进程的,而使用 pkill 命令则不会

[root@admin ~]# w
#使用w命令查询本机已经登录的用户09:17:21 up 41 min,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      09:12    4:57   0.02s  0.02s -bash
root     pts/0    192.168.126.1    08:37    1.00s  0.42s  0.02s w
dxk      pts/1    192.168.126.1    09:17    6.00s  0.02s  0.02s -bash
#当前主机已经登录了三个用户,一个是本地终端tty1登录,另外两个是从192.168.126.1登陆的远程登录
[root@admin ~]# pkill -9 -t pts/1  #强制杀死从pts/1虚拟终端登陆的进程
[root@admin ~]# w09:17:24 up 41 min,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      09:12    5:00   0.02s  0.02s -bash
root     pts/0    192.168.126.1    08:37    4.00s  0.41s  0.01s w
#虚拟终端pts/1的登录进程已经被杀死了

四、查看系统资源的使用状况vmstat

动态的了解系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源

vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息

用法:

vmstat [-a] [刷新延时 刷新次数]
vmstat [选项]

选项:

  • -a: 显示活跃和非活跃内存
  • -f: 显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的
  • -s: 将从启动到目前为止,由一些事件导致的内存变化情况列表说明。
  • -S 单位: 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。
  • -d: 列出硬盘有关读写总量的统计表。
  • -p: 分区设备文件名 查看硬盘分区的读写情况。
  • -D: 显示磁盘总体信息
  • -n: 只在开始时显示一次各字段名称
[root@admin ~]# vmstat 1 3
#使用vmstat检测,每隔1秒刷新一次,共刷新3次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st2  0      0 672436   2184 111476    0    0   203    21  135  411  1  3 89  8  00  0      0 672188   2184 111476    0    0     0     0   62  104  1  1 98  0  00  0      0 672188   2184 111476    0    0     0     0   58   97  0  0 100  0  0

各个字段输出含义:

字段 含义
procs 进程信息字段:r: 等待运行的进程数,数量越大,系统越繁忙。b:不可被唤醒的进程数量,数量越大,系统越繁忙。
memory 内存信息字段:swpd:虚拟内存的使用情况,单位为 KB。free:空闲的内存容量,单位为 KB。buff:缓冲的内存容量,单位为 KB。cache:缓存的内存容量,单位为 KB。
swap 交换分区信息字段:si:从磁盘中交换到内存中数据的数量,单位为 KB。so:从内存中交换到磁盘中数据的数量,单位为 KB。这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。
io 磁盘读/写信息字段:bi:从块设备中读入的数据的总量,单位是块。bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。
system 系统信息字段:in:每秒被中断的进程次数。cs:每秒进行的事件切换次数。这两个数越大,代表系统与接口设备的通信越繁忙。
cpu CPU信息字段:us:非内核进程消耗 CPU 运算时间的百分比。sy:内核进程消耗 CPU 运算时间的百分比。id:空闲 CPU 的百分比。wa:等待 I/O 所消耗的 CPU 百分比。st:被虚拟机所盗用的 CPU 百分比。

常见问题处理:

  • 如果在processes中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU。
  • 如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢。
  • 如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us)系统则面临着CPU资源的短缺。

Linux笔记 No.20---(进程管理工具:ps、pstree、top、pgrep、kill、killall、pkill、查看系统资源的使用vmstat)相关推荐

  1. 24.Linux进程管理工具——ps,pstree,pgrep,kill,top,htop,vmstat

    1.        ps 显示系统进程瞬间的运行动态的命令ps (1)选项:-A:所有的进程均显示出来,与 -e 具有同样的效果: -a:显示现行终端机下的所有进程,包括其他用户的进程: -u:以用户 ...

  2. Linux进程管理(ps,pgrep,kill,killall,pkill,nohup,bg,fg)

    文章目录 Linux进程管理 什么是进程?什么是线程?二者的区别? Linux进程管理命令 ps命令 使用方法案例 ps带减号和不带减号的区别 查看进程树的命令pstree pgrep命令 kill命 ...

  3. linux进程管理 ps,Linux - 进程管理,ps与top

    一个运行的程序,可能有多个进程. PID进程ID. UID启动进程的ID. 进程所属组GID. 进程的状态R运行.S睡眠.Z僵尸. 父进程管理子进程,父进程终止的时候子进程也会终止. 常用的组合为: ...

  4. linux下几种进程管理工具

    runit,supervisord,monit , Daemontools简介

  5. Linux 进程管理工具

    Linux进程管理命令:     pstree.ps.top.pidof.htop.glances.pmap.vmstat.dstat.kill.pkill.job.bg.fg.nohup.pgrep ...

  6. Linux进程管理之ps的使用

    主题Linux进程管理之ps工具的使用 一ps工具的介绍 ps: process state  进程状态 ps - report a snapshot of the current processes ...

  7. 11、Linux系统基础原理、进程管理工具、任务计划

    Linux进程及作业管理 ​ 内核的功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能 ​ Process: 运行中的程序的一个副本: ​ 存在生命周期 Linux内核存储进程信息的固定 ...

  8. 进程管理工具(Supervisor)笔记

    感谢GoFrame框架实战2群的 朽木自雕 大佬提供的Supervisor笔记 # 开发笔记## [进程管理工具(Supervisor)](http://supervisord.org/introdu ...

  9. web linux进程管理,详解Supervisor安装与配置(Linux/Unix进程管理工具)

    Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统 ...

最新文章

  1. 对Python课的看法
  2. 胡玮炜卸任摩拜CEO,或将成为美团大裁员的开端
  3. 17年9月计算机二级试题,9月计算机二级MSOffice练习试题
  4. flutter中本地存储shared_preferences的使用
  5. KingPaper初探ThinkPHP3.1.2之目录部署(二)
  6. pythonwhile循环怎么修改数据类型_python开发学习day05 (while循环; for循环; 数字类型操作)...
  7. 怎样管理计算机制动开关时间,3分钟让你明白按钮启动如何工作的。
  8. [UE4]导入 PSD 文件失败的解决办法:输出为 PNG,将 PNG 再保存为 PSD 导入
  9. 北大教授证明黎曼猜想?但在前一天取消了
  10. vscode右键没有open in browser
  11. linux NVMe驱动总结
  12. linux下淘宝支付宝安全控件安装
  13. 转载GIT 学习--活灵活现用Git(二)
  14. 华三交换机基本配置命令
  15. 几何公差学习笔记(二)-- 公差带的定义、标注和解释
  16. 纯CSS3实现文字背景图滚动动画
  17. 工行网银助手发癫,谷歌g.cn中枪了
  18. DNS解析为什么不生效?DNS解析不生效原因分析
  19. 短视频开发,录制视频添加背景音乐功能实现
  20. socket连接 error 113 /111 的解决方法

热门文章

  1. 中央空调远程监控运维系统成功应用案例
  2. 64位 linux 安装gmp,无法在centOS中安装GMP
  3. 【翻译】和麻美学姐一起的世界树(マミさんと世界樹スレ)第五话
  4. .NET SOAP详解
  5. 利用jieba库和wordcloud库,进行中文词频统计并利用词云图进行数据可视化
  6. 关于养生, 读书笔记
  7. flash转canvas 一些坑(CreateJS)
  8. 【资料】9 W字 | 阿宝哥 · 242 页前端进阶资料
  9. 常用CSS与Jquery选择器
  10. 多列网页布局CSS float 属性和 CSS Clear 属性