抑郁症健康,内容丰富有趣,生活中的好帮手!
抑郁症健康 > Linux笔记 No.20---(进程管理工具:ps pstree top pgrep kill killall pkill 查看系统资源的使用vmstat)

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

时间:2024-03-25 15:05:57

相关推荐

文章目录

一、定时任务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/testthis is a test ... 10月 26日 星期一 18:03:01 CSTthis is a test ... 10月 26日 星期一 18:03:11 CSTthis is a test ... 10月 26日 星期一 18:03:21 CSTthis is a test ... 10月 26日 星期一 18:03:31 CSTthis is a test ... 10月 26日 星期一 18:03:41 CSTthis is a test ... 10月 26日 星期一 18:03:51 CSTthis is a test ... 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 $SECdoneexit 0:wq#将写好的脚本放入计划任务中进行每分钟执行[root@admin ~]# crontab* * * * * /usr/bin/sh /root/crontab.sh [root@admin ~]# tailf /root/test1this is a test ...-10-26+18:10:08this is a test ...-10-26+18:10:10this is a test ...-10-26+18:10:12this is a test ...-10-26+18:10:14this is a test ...-10-26+18:10:16this is a test ...-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: initCentos7: 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 TTYSTAT START TIME COMMANDroot1 0.2 0.3 128000 6660 ? Ss 09:16 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22root2 0.0 0.000 ? S 09:16 0:00 [kthreadd]root3 0.1 0.000 ? S 09:16 0:02 [kworker/0:0]root4 0.0 0.000 ? S< 09:16 0:00 [kworker/0:0H]root5 0.0 0.000 ? S 09:16 0:00 [kworker/u256:0]root6 0.0 0.000 ? S 09:16 0:00 [ksoftirqd/0]…省略部分输出…

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

【例 2】

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

[dxk@admin ~]$ ps -leF S UID PID PPID C PRI NI ADDR SZ WCHAN TTYTIME CMD4 S010 0 80 0 - 32000 ep_pol ? 00:00:03 systemd1 S020 0 80 0 -0 kthrea ? 00:00:00 kthreadd1 S032 0 80 0 -0 worker ? 00:00:03 kworker/0:01 S042 0 60 -20 -0 worker ? 00:00:00 kworker/0:0H1 S052 0 80 0 -0 worker ? 00:00:00 kworker/u256:0……省略部分输出信息……

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

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

[dxk@admin ~]$ ps -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTYTIME CMD0 S 1000 1640 1639 0 80 0 - 28917 do_wai pts/1 00:00:00 bash0 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 httpd19 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 -psystemd(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 dxksshd───bash─┬─ping└─top[root@admin ~]# pstree -p 1249sshd(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.05Tasks: 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 stKiB Mem : 1863040 total, 1527264 free, 192192 used, 143584 buff/cacheKiB Swap: 3907580 total, 3907580 free, 0 used. 1519428 avail Mem PID USERPR NI VIRT RES SHR S %CPU %MEMTIME+ COMMAND 1916 dxk 20 0 162116 2256 1580 R 0.3 0.1 0:00.10 top1 root20 0 128000 6660 4144 S 0.0 0.4 0:03.26 systemd 2 root20 0 000 S 0.0 0.0 0:00.03 kthreadd3 root20 0 000 S 0.0 0.0 0:07.92 kworker/0:0 4 root 0 -20 000 S 0.0 0.0 0:00.00 kworker/0:0H5 root20 0 000 S 0.0 0.0 0:00.44 kworker/u256:0 6 root20 0 000 S 0.0 0.0 0:00.18 ksoftirqd/0 7 rootrt 0 000 S 0.0 0.0 0:00.70 migration/0 8 root20 0 000 S 0.0 0.0 0:00.00 rcu_bh ……省略部分输出……

说明输出的内容:

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

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

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

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

第一部分信息的含义:

第一行为任务队列信息

第二行为进程信息

第三行为CPU信息

第四行为物理内存信息

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

可以使用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 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:

这部分和 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.05Tasks: 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 stKiB Mem : 1863040 total, 1527908 free, 191528 used, 143604 buff/cacheKiB Swap: 3907580 total, 3907580 free, 0 used. 150 avail Mem PID USERPR NI VIRT RES SHR S %CPU %MEMTIME+ COMMAND 1639 dxk20 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 httpd186671867018671186721867318674

同时显示PID和进程名称

[root@admin ~]# pgrep -l httpd18667 httpd18670 httpd18671 httpd18672 httpd18673 httpd18674 httpd

【例 2】

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

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

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

[root@admin ~]# pgrep -l -n httpd18674 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) SIGKILL10) SIGUSR111) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+338) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+843) SIGRTMIN+944) SIGRTMIN+1045) SIGRTMIN+1146) SIGRTMIN+1247) SIGRTMIN+1348) SIGRTMIN+1449) SIGRTMIN+1550) SIGRTMAX-1451) SIGRTMAX-1352) SIGRTMAX-1253) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-758) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-263) SIGRTMAX-164) SIGRTMAX

常用信号:

说明:只有第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 1HUP[root@admin ~]# kill -l HUP1[root@admin ~]# kill -l kill9[root@admin ~]# kill -l term15

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

[root@admin ~]# kill -l

【例 2】

向进程发送特定的信号

结束进程

[root@admin ~]# ping > /dev/null &[1] 21189[root@admin ~]# jobs[1]+ 运行中ping > /dev/null &[root@admin ~]# kill -2 21189[root@admin ~]# jobs[1]+ 完成 ping > /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 httpd19307[root@admin ~]# kill 19307#其实就等价于kill -15 19307

【例 4】

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

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

【例 5】

向多个进程发信号或终止它们

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

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

【例 6】

当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下

Enter键使shell的命令提示符再次出现时,才会显示出来

[root@admin ~]# kill -9 22030[root@admin ~]# [1]+ 已杀死ping > /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 dxksshd(1914)───bash(1915)─┬─ping(1950)└─top(1970)[root@admin ~]# killall -u dxk[root@admin ~]# pstree -p dxk未发现进程。

【例 2】

忽略大小写

[root@admin ~]# pgrep httpd218321862187218821892190[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 > /dev/null &[1] 2593[root@admin ~]# pstree 2593 #查看PID所对应的进程名ping[root@admin ~]# killall -2 ping[1]+ 完成 ping > /dev/null#也可写成:killall -s 2 ping

【例 5】

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

【例 6】

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

【例 7】

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

(七)pkill

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

用法:pkill [SIGNAL] 进程名

信号和kill及killall相同

【例 1】

发送指定信号(同 killall )

[root@admin ~]# ping > /dev/null &[1] 3931[root@admin ~]# pkill -2 ping[1]+ 完成 ping > /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.05USERTTYFROM LOGIN@ IDLE JCPU PCPU WHATroottty1 09:12 4:57 0.02s 0.02s -bashrootpts/0 192.168.126.1 08:37 1.00s 0.42s 0.02s wdxkpts/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.05USERTTYFROM LOGIN@ IDLE JCPU PCPU WHATroottty1 09:12 5:00 0.02s 0.02s -bashrootpts/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 00 672436 2184 111476 0 0 203 21 135 411 1 3 89 8 00 00 672188 2184 111476 0 000 62 104 1 1 98 0 00 00 672188 2184 111476 0 000 58 97 0 0 100 0 0

各个字段输出含义:

常见问题处理:

如果在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)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。