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) )); do
echo "this is a test ...`date "+%F+%T"`" >> /root/test1
sleep $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
程序是一组指令及参数的集合,按照既定的逻辑控制计算机运行用来完成特定任务
进程则是运行着的程序,是操作系统执行的基本单位,是程序运行的过程, 动态。有生命周期及运行状态
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID(PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代:
子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程 在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。 父进程终止子进程自终止。
子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。
ps 命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息
用法: ps [选项]
选项:
输出格式选项:
可以看到,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 httpd
2068 /usr/sbin/httpd -DFOREGROUN 19 0
2071 /usr/sbin/httpd -DFOREGROUN 19 0
2072 /usr/sbin/httpd -DFOREGROUN 19 0
2073 /usr/sbin/httpd -DFOREGROUN 19 0
2074 /usr/sbin/httpd -DFOREGROUN 19 0
2075 /usr/sbin/httpd -DFOREGROUN 19 0
25496 grep --color=auto httpd 19 0
僵尸进程的产生一般是由于进程非正常停止或程序编写错误,导致子进程先于父进程结束,而父进程又没有正确地回收子进程,从而造成子进程一直存在于内存当中,这就是僵尸进程。僵尸进程会对主机的稳定性产生影响,所以,在产生僵尸进程后,一定要对产生僵尸进程的软件进行优化,避免一直产生僵尸进程;对于已经产生的僵尸进程,可以在查找出来之后强制中止
以树形结构显示程序和进程之间的关系(即哪个进程是父进程,哪个是子进程)
用法: pstree [options] [ PID | USER ]
选项:
需要注意的是:
在使用 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
ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。
为此,Linux 提供了 top 命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。
通过top命令查看系统的CPU、内存、运行时间、交换分区、执行的线程等信息。通过top命令可以有效的发现系统的缺陷出在哪里。是内存不够、CPU处理能力不够、IO读写过高…
用法: top [选项]
选项:
在 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 秒刷新一次。命令的输出主要分为三部分:
第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的;
第二部分是第六行,提供人机交互;
第三部分从第七行开始,显示的是系统中进程的信息;
第一部分信息的含义:
第一行为任务队列信息
内容 | 说明 |
---|---|
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)是用来加速数据"写入"硬盘的。
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 [options]
选项:
【例 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 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。kill命令是通过向进程发送指定的信号来结束相应进程的。
用法: kill [-SIGNAL] PID
选项:
kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。Linux 定义了几十种不同类型的信号,可以使用 kill -l 命令查看所有信号及其编号
[root@admin ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) 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 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程
使用kill命令杀死指定PID的进程时,首先需要在杀死之前使用 ps、pstree、top 等命令再配合grep来查找进程,而killall把这两个过程合二为一
用法: killall [选项] [信号] 进程名
选项:
此命令的信号类型和使用同 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是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 ~]# w
09: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命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息
用法:
vmstat [-a] [刷新延时 刷新次数]
vmstat [选项]
选项:
[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 st
2 0 0 672436 2184 111476 0 0 203 21 135 411 1 3 89 8 0
0 0 0 672188 2184 111476 0 0 0 0 62 104 1 1 98 0 0
0 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 百分比。 |
常见问题处理: