程序:一组计算机能识别和执行的指令集合,可以按照既定的逻辑控制计算机运行来完成特定的功能。
进程:正在运行的程序,是操作系统进行资源分配和调度的基本单位,每个进程都有独立的地址空间,并且占用一定的系统资源。
区别和关系:
① 程序是静态的,它只是一组指令的集合,而进程是程序运行的动态过程。
② 进程和程序并不是一一对应的关系,同一个程序运行在不同的数据集上就是不同的进程。
③ 程序是封闭的,而进程具有并发性和交往性。
线程:操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
线程与进程的关系:
① 一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有。
② 线程不能单独执行,但每一个线程都有程序入口、执行序列以及程序出口,它必须组成进程才能被执行。
父进程调用fork()系统调用得到一个新的(子)进程描述且分配一个唯一的进程ID(PID),并复制该值到父进程描述的子进程中,父子进程共享相同的地址空间,此时父进程将被堵塞,直到子进程退出或执行exec()系统调用才会继续运行。
exec()系统调用复制新的程序到子进程的地址空间,因为与父进程共享地址空间,会产生一个分页错误,系统会为子进程分配新的物理内存。
当程序执行完成后,子进程会调用exit()系统调用,释放进程大部分的数据并发送一个信号通知其父进程。此时子进程就变为一个僵尸进程(zombie)。
当父进程接受到了子进程的终止信号,它会释放子进程的所有的资源。
手工启动进程指的是由用户输入命令直接启动一个进程,根据所启动的进程类型和性质的不同,又可以细分为前台启动和后台启动 2 种方式。
Ⅰ、前台启动
手工启动一个进程的最常用的方式,在 Shell 提示处输入命令后,创建一个子进程并运行命令,Shell 等待命令退出,然后返回到对用户给出提示符。这条命令与 Shell 同步运行,即在前台运行,用户在它完成之前不能执行别的命令。
Ⅱ、后台启动
在 Shell 提示处输入命令时,在其后加一个" &"(&前面有空格),创建一个子进程并运行命令,但不等待命令退出,而直接返回到对用户给出提示符。这条命令与 Shell 异步运行,即在后台运行。进程直接从后台运行,用的相对较少,除非该进程非常耗时,且用户也不急着需要其运行结果的时候,且后台进程必须是非交互式的。
在 Linux 系统中,任务可以被配置在指定的时间、日期或者系统平均负载量低于指定值时自动启动,执行结果会通过邮件发给用户。这里需要使用到 at 命令和crontab 命令。
at, batch, atq, atrm - queue, examine or delete jobs for later execution(排队、检查或删除作业以供以后执行)
如果某项工作在特定的时间执行一次,就可以使用 at 命令。
可以看到上面的 at 说明中还有其他相关命令,其中:
命 令 | 解 释 |
---|---|
atq | 列出用户的计划任务,如果是超级管理员则会列出所有用户的计划任务 |
atrm | 根据工作号删除 at 的定时任务 |
batch | 在系统空闲的情况下执行 at 定时任务 |
at 命令在使用之前需要安装,并开启独立的 atd 服务。
[root@localhost ~]# yum install at //安装at命令
[root@localhost ~]# service atd start //启动atd服务
Starting atd: [ OK ]
选 项 | 作 用 |
---|---|
-m | 当 at 工作完成后,无论命令是否输出,都用 E-mail 通知执行 at 命令的用户 |
-d | 删除某个工作,同 atrm 命令的作用相同 |
-l | 列出当前所有等待运行的工作,和 atq 命令的作用相同 |
-f 文件 | 读取脚本文件 |
-c 工作号 | 根据工作号显示 at 工作的实际内容 |
格 式 | 解 释 |
---|---|
HH:MM | 24小时制,例如:13:14 |
Midnight | 表示 00:00 |
Noon | 表示 12:00 |
Teatime | 表示 16:00 |
MMDDYY MM/DD/YY MM-DD-YY MM.DD.YY |
例如:021520,表示2020年2月15日 |
now + 时间 | 相对时间,时间单位可选:minutes、hours、days 和 weeks ,例如:now + 5 minutes,表示5分钟后执行 |
① 三天后重启网络;
[root@localhost ~]# at now + 3 days
at> service network restart
job 1 at 2020-04-25 18:53 //使用Ctrl+d组合键保存
② 查看at的定时任务
[root@localhost ~]# atq //两个命令都可以
1 2020-04-25 18:53 a root
[root@localhost ~]# at -l
1 2020-04-25 18:53 a root
③ 查看at的定时任务的实际内容
[root@localhost ~]# at -c 1 //查看工作号为1的任务实际内容
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
...省略部分内容
service network restart //这里就是啦
marcinDELIMITER53857a3a
④ 删除at的定时任务
[root@localhost ~]# atrm 1
[root@localhost ~]# at -d 1 //两个命令都可以
Cannot find jobid 1 //因为上一个命令已经删除工作号为1的作业,所以找不到作业
[root@localhost ~]# atq
crontab - maintain crontab files for individual users(为单个用户维护crontab文件)
在前面所讲到的 at 命令只能在特定时间执行一次任务,显然在实际工作中是不够的,这就需要 crontab 命令来重复执行定时任务。
首先来了解一下 crond,它是Linux下用来周期性地执行某种任务或等待处理某些事件的一个守护进程,与Windows的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程。crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则会自动执行该任务。
选 项 | 作 用 |
---|---|
-u user | 指定用户,如果不指定,则表示当前用户 |
-l | 列出指定用户的计划任务列表 |
-e | 编辑指定用户的计划任务列表 |
-r | 删除指定用户的计划任务列表 |
-i | 交互模式,即给出确认提示 |
使用 crontab -e 可以编辑用户自己的计划任务(一个空文件,格式需要自己编写,之后保存在 /var/spool/cron 目录下),如果定时任务需要系统执行,这是就需要编辑 /etc/crontab 这个配置文件。
[root@localhost ~]# cat /etc/crontab #/etc/crontab 文件对计划任务的格式有一定的提示信息,我们以它来初步了解计划任务的语法格式
SHELL=/bin/bash #标识使用的Shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #指定PATH环境变量
MAILTO=root #如果命令结果或报错有输出,则会向root发送信息
HOME=/ #标识主目录
# For details see man 4 crontabs #以上内容是crontab的环境变量,用户编写自己的计划任务时不需要写的哦!
# Example of job definition: #系统计划任务的规则语法格式
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed #在编写系统定时任务时,一定要注意指明 user—name
用户自己的计划任务的规则语法格式,与系统定时任务大同小异,也是以行为单位,一行则为一个计划,但唯一的区别是不需要指定用户名:分 时 日 月 周 需要执行的命令 。
下面我们对计划任务的规则语法格式具体进行介绍;
取值范围:
时 间 | 范 围 |
---|---|
分 (一小时中的第几分钟) | 0~59 |
时 (一天中的第几时) | 0~23 |
日 (一个月中的第几日) | 1~31 |
月 (一年中的第几月) | 1~12 |
周 (一个周中的星期几) | 0~7,0和7表示星期天 |
四个符号:
符 号 | 含 义 |
---|---|
* | 表示取值范围中的每一个数字 |
- | 表示连续的时间范围。在周的位置写:1-7,表示周一到周天 |
, | 表示间断的时间范围。在时的位置写:1,4,7,表示1点、4点和7点 |
/ | 代表每隔多久执行一次。在分的位置写:*/10,表示每隔十分钟 |
超级管理员可以通过配置 /etc/cron.allow (白名单) 和 /etc/cron.deny (黑名单) 两个文件来限制某些用户是否可以使用 crontab 命令,配置时在这两个名单中每行写一个用户名,即可达到效果。
① 当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。
② 当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入的用户则可以使用 crontab 命令。
③ 白名单优先级高于黑名单,如果一个用户同时存在两个名单文件中,则可以使用 crontab 命令。
① 每小时的第5分钟和第15分钟向 /tmp/testfile 文件内写入当前时间;
5,15 * * * * date >> /tmp/testfile
② 每天上午的8~12点的第5分钟和第15分钟重启网络
5,15 8-12 * * * service network restart
③ 每隔2天的上午的8-12点的第5分钟和第15分钟重启系统
5,15 8-12 */2 * * reboot
④ 每星期一的晚上23:30重启crond服务
30 23 * * 1 service crond restart
一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。
作业控制指的是控制正在运行的进程的行为,比如:启动、停止、强制终止、恢复以及异步运行作业的这些功能,让shell可以在子进程运行期间返回接受其他命令。
一般而言,进程与作业控制相关联时,才被称为作业。
① 在命令后面加上" &"(&前面有空格),可以把这个命令放到后台执行。
[root@localhost ~]# sleep 1m &
[1] 1850 //工作号(每个后台命令都会分配) 进程号
② 命令执行过裎中按 Ctrl+Z 组合键,命令会放到后台并处于暂停状态。
[root@localhost ~]# sleep 1m
^Z
[1]+ Stopped sleep 1m
使用 jobs 命令可以查看当前终端放入后台的工作,命令语法: jobs [ 选项 ]
命令常用选项
选 项 | 作 用 |
---|---|
-l | 列出进程的 PID |
-p | 只列出进程的 PID |
-r | 只列出运行中的进程 |
-s | 只列出已停止的进程 |
-n | 只列出最近一次状态改变的进程 |
实例
查看放入后台的作业;
[root@localhost ~]# jobs -l
[1] 1850 Done sleep 1m &
[2]- 1851 run sleep 2m
[3]+ 1852 Stopped sleep 3m
当前终端有三个后台作业。其中,第一个字段为工作号;"+/-" 代表最近 "第一个/第二个"放入后台的作业;因为使用 -l 选项,所以第三个字段列出了进程的 PID;第四个字段表示作业的状态,Done、run、Stopped 和 terminated 分别表示 完成、运行中、暂停、终止状态;最后一个字段为启动作业的命令。
前面我们讲到将作业放入后台,使用 Ctrl+z 组合键时,作业进入后台并且处于暂停状态。有什么办法让作业在后台恢复执行吗?
答案是有的!这就需要用到 bg 命令。命令语法: bg %工作号 ;
[root@localhost ~]# sleep 1m //使用Ctrl+z键将作业放入后台并暂停状态
^Z
[1]+ Stopped sleep 1m
[root@localhost ~]# bg %1 //恢复执行状态
[1]+ sleep 1m &
[root@localhost ~]# jobs //查看状态
[1]+ Running sleep 1m &
之前所讲的都是讲作业放到后台执行,那么有什么办法让后台作业恢复到前台执行吗?
答案当然是有的!fg 命令就可以做到!命令语法: fg %工作号 ;
[root@localhost ~]# sleep 1m & //后台执行作业
[1] 2072
[root@localhost ~]# fg %1 //恢复前台执行状态
sleep 1m
很简单,使用 kill %工作号 就可以!
[root@localhost ~]# sleep 1m & //后台执行作业
[1] 2073
[root@localhost ~]# kill %1 //杀死工作号为1的作业
[root@localhost ~]# jobs //终止状态
[1]+ Terminated sleep 1m
一般当我们断开终端时,终端会收到SIGHUP信号从而关闭所有子进程。如果不希望某些进程被这个SIGHUP信号影响,就需要用到 nohup 命令。nohup 命令可以让后台作业在离开终端时,也能正确地在后台执行。命令语法: nohup 命令 & ;
[root@localhost ~]# nohup ping www.baidu.com &
[1] 2413
[root@localhost ~]# nohup: 忽略输入并把输出追加到 `nohup.out'
tips: ① 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
② 如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
③ 如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。
在Linux系统中,表示进程优先级的有两个数值:nice(NI) 和 priority(PR)。其中,我们只能通过修改nice值(也叫静态优先级)来调整进程优先级,因为priority值是由内核动态调整的(也叫动态优先级),用户是不能直接修改的。
他们之间存在着这样的关系:
PR(最终值)= PR (原始值) + NI
PR(最终值)数值越小,代表该进程的优先级越高,在同一个CPU调度周期中所占的时间更长。
所以说,nice值越小,进程的优先级就越高;反之,nice值越大,进程的优先级就越低。我们可以通过 renice 命令来调整一个进程的nice值。
其中,我们需要注意的是:
① nice的取值范围为:-20~19,一共四十个级别;
② 普通用户只能调整自己的进程,调整nice值的范围为 0~19,且不能降低nice值,即只能降低进程的优先级;
③ root用户可以调整任何用户的进程,并且在nice值的取值范围内可以任意调整。
① 使用ps命令;
[root@localhost ~]# ps -le //第八个字段即为nice值
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 4840 poll_s ? 00:00:01 init
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 -40 - - 0 migrat ? 00:00:00 migration/0
1 S 0 4 2 0 80 0 - 0 ksofti ? 00:00:00 ksoftirqd/0
1 S 0 5 2 0 -40 - - 0 cpu_st ? 00:00:00 stopper/0
...省略部分信息
② 使用top命令;
[root@localhost ~]# top //第四个字段即为nice值
top - 20:00:35 up 5:56, 1 user, load average: 0.08, 0.03, 0.05
Tasks: 88 total, 1 running, 87 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1004136k total, 235572k used, 768564k free, 47332k buffers
Swap: 2097148k total, 0k used, 2097148k free, 54556k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2665 root 20 0 15024 1292 996 R 0.3 0.1 0:00.41 top
1 root 20 0 19360 1524 1228 S 0.0 0.2 0:01.41 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
...省略部分信息
可以通过 nice 命令和 renice 命令 对 nice 值进行调整。其中,nice命令可以对要启动的程序赋予 nice 值,而 renice命令可以对进程的 nice 值进行修改。
① nice命令;
命令语法: nice [-n nice值] 命令 ;
[root@localhost ~]# nice -n -5 /usr/local/httpd-2.4.41/bin/apachectl start //启动httpd服务并赋予nice值为-5
[root@localhost ~]# ps -le | grep httpd //可以看到所有的httpd进程nice值都为-5
1 S 0 2117 1 0 75 -5 - 17593 poll_s ? 00:00:00 httpd
5 S 2 2118 2117 0 75 -5 - 103658 pipe_w ? 00:00:00 httpd
5 S 2 2119 2117 0 75 -5 - 103658 pipe_w ? 00:00:00 httpd
5 S 2 2120 2117 0 75 -5 - 103658 pipe_w ? 00:00:00 httpd
② renice命令;
命令语法: renice [nice值] PID ;
[root@localhost ~]# /usr/local/httpd-2.4.41/bin/apachectl start //启动httpd服务
[root@localhost ~]# ps -le | grep httpd //查看httpd服务的进程信息
1 S 0 21910 1 0 80 0 - 17593 poll_s ? 00:00:00 httpd
5 S 2 21911 21910 0 80 0 - 103658 pipe_w ? 00:00:00 httpd
5 S 2 21912 21910 0 80 0 - 103658 pipe_w ? 00:00:00 httpd
5 S 2 21913 21910 0 80 0 - 103658 pipe_w ? 00:00:00 httpd
[root@localhost ~]# renice -10 21913 //修改进程号为21913的进程nice值为-10
21913: old priority 0, new priority -10
[root@localhost ~]# ps -le | grep httpd | grep 21913 //可以看到已经修改成功
5 S 2 21913 21910 0 70 -10 - 103658 pipe_w ? 00:00:00 httpd
选 项 | 作 用 |
---|---|
a | 显示所有终端的所有进程,除了阶段作业领导者之外 |
-a | 显示当前终端的所有进程,包括其他用户的进程 |
-u | 显示进程的归属用户及内存的使用情况 |
x | 显示没有控制终端的进程 |
-A 或 -e | 显示所有进程 |
-f | 显示较为详细的信息 |
-l | 长格式显示更加详细的信息 |
通常我们使用 ps -aux 和 ps -ef 配合管道符号(|)来查看特定进程的状态信息。
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 19360 1524 ? Ss 21:47 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 21:47 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 21:47 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S 21:47 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S 21:47 0:00 [stopper/0]
root 6 0.0 0.0 0 0 ? S 21:47 0:00 [watchdog/0]
...省略部分信息
下表对各字段的含义进行解释:
字 段 | 含 义 |
---|---|
USER | 运行该进程的用户名称 |
PID | 该进程的 ID |
%CPU | 该进程占用CPU的百分比 |
%MEM | 该进程占用物理内存的百分比 |
VSZ | 该进程占用虚拟内存的大小,单位为 KB |
RSS | 该进程占用实际物理内存的大小,单位为 KB |
TTY | 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端,pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端 |
STAT | 该进程的状态。D:不可中断的睡眠状态,通常用于 I/O 情况;S:睡眠状态,可被唤醒;T:停止状态;R:正在运行;Z:僵尸进程,进程已经终止,但仍然占用一些系统资源;-<:高优先级;-N:低优先级;-s:包含子进程;-l:多线程;-+:位于后台 |
START | 进程的启动时间 |
TIME | 该进程占用 CPU 的时间 |
COMMAND | 产生该进程的命令名 |
[root@localhost ~]# ps -le
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 4840 poll_s ? 00:00:01 init
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 -40 - - 0 migrat ? 00:00:00 migration/0
1 S 0 4 2 0 80 0 - 0 ksofti ? 00:00:00 ksoftirqd/0
1 S 0 5 2 0 -40 - - 0 cpu_st ? 00:00:00 stopper/0
1 S 0 6 2 0 -40 - - 0 watchd ? 00:00:00 watchdog/0
...省略部分信息
下表对各字段的含义进行解释:
字 段 | 含 义 |
---|---|
F | 进程标志,表示进程的权限,常见的有:1 进程可以被复制,但不能被执行;4 进程使用超级用户权限 |
S | 该进程的状态,具体与"ps aux"中的STAT字段相同 |
UID | 运行该进程的用户 ID |
PID | 该进程的 ID |
PPID | 该进程父进程的 ID |
C | 该进程占用CPU的百分比 |
PRI | 动态优先级(priority),由内核动态调整 |
NI | 静态优先级(nice),用户可以进行调整 |
ADDR | 该进程在内存中的位置 |
SZ | 该进程占用内存的大小 |
WCHAN | 该进程是否运行。"-"代表正在运行 |
TTY | 该进程是在哪个终端运行的 |
TIME | 该进程占用 CPU 的时间 |
CMD | 产生该进程的命令名 |
查看http服务的进程状态;
[root@localhost ~]# ps -ef | grep httpd
root 2155 1 0 00:44 ? 00:00:00 /usr/sbin/httpd
apache 2157 2155 0 00:44 ? 00:00:00 /usr/sbin/httpd
apache 2158 2155 0 00:44 ? 00:00:00 /usr/sbin/httpd
apache 2159 2155 0 00:44 ? 00:00:00 /usr/sbin/httpd
apache 2160 2155 0 00:44 ? 00:00:00 /usr/sbin/httpd
apache 2161 2155 0 00:44 ? 00:00:00 /usr/sbin/httpd
apache 2162 2155 0 00:44 ? 00:00:00 /usr/sbin/httpd
apache 2163 2155 0 00:44 ? 00:00:00 /usr/sbin/httpd
apache 2164 2155 0 00:44 ? 00:00:00 /usr/sbin/httpd
root 2166 1804 0 00:44 pts/0 00:00:00 grep httpd
使用命令 yum install psmisc 安装 pstree 命令。
选 项 | 作 用 |
---|---|
-A | 使用ASCII字符绘制树 |
-U | 使用UTF-8字符绘制树 |
-p | 显示进程的 PID |
-u | 显示进程对应的用户名称 |
查看进程树
[root@localhost ~]# pstree
init─┬─NetworkManager─┬─dhclient //其中init进程是系统启动的第一个进程,是系统中所有进程的父进程
│ └─{NetworkManager}
├─atd
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─hald─┬─hald-runner─┬─hald-addon-acpi
│ │ └─hald-addon-inpu
│ └─{hald}
├─master─┬─pickup
│ └─qmgr
├─6*[mingetty]
├─modem-manager
├─rsyslogd───3*[{rsyslogd}]
├─sshd─┬─sshd───bash───pstree
│ └─sshd───sftp-server
├─udevd───2*[udevd]
└─wpa_supplicant
选 项 | 作 用 |
---|---|
-l | 同时显示 PID 和进程名称 |
-o | 即 old,当匹配程序有多个进程时,显示进程号最小的那个(最先启动的) |
-n | 即 new,当匹配程序有多个进程时,显示进程号最大的那个(进程号越大,并不一定意味进程的启动时间越晚) |
① 查看httpd服务的进程 ID 和名称;
[root@localhost ~]# pgrep -l httpd
2106 httpd
2108 httpd
2109 httpd
2110 httpd
2111 httpd
2112 httpd
2113 httpd
2114 httpd
2115 httpd
② 查看httpd服务最先启动的进程 ID;
[root@localhost ~]# pgrep -o httpd
2106
信 号 | 信号名 | 含 义 |
---|---|---|
0 | SIGEXIT | 不发送任何信号,一般用来检查一个进程是否存在 |
1 | SIGHUP | 断开终端连接,这个信号也会造成某些进程在没有终止的情况下重新初始化 |
2 | SIGINT | 结束进程,但并不是强制性的,相当于组合键 “Ctrl+c” |
3 | SIGQUIT | 退出,相当于组合键 “Ctrl+/” |
9 | SIGKILL | 杀死进程,即强制结束进程 |
15 | SIGTERM | 正常结束进程,是 kill 命令的默认信号 |
18 | SIGCONT | 恢复进程的执行 |
19 | SIGSTOP | 暂停进程的执行,相当于组合键 “Ctrl+z” |
如果需要查看所有信号及其对应编号,可以使用 kill -l 命令,通过对这里的了解,我们可以知道kill 命令只是发送一个"信号",所以只有当信号被成功捕获的时候 kill 命令才能发挥相应的作用。
① 结束httpd服务的一个子进程;
[root@localhost ~]# pstree -p | grep httpd //查看httpd服务
|-httpd(1922)-+-httpd(1924)
| |-httpd(1925)
| |-httpd(1926)
| |-httpd(1927)
| |-httpd(1928)
| |-httpd(1929)
| |-httpd(1930)
| `-httpd(1931)
[root@localhost ~]# kill 1931 //杀死PID为1931的httpd进程,正常停止
[root@localhost ~]# pstree -p | grep httpd
|-httpd(1922)-+-httpd(1924)
| |-httpd(1925)
| |-httpd(1926)
| |-httpd(1927)
| |-httpd(1928)
| |-httpd(1929)
| `-httpd(1930) //可以发现进程号为1931的子进程已经结束
② 重启进程;
[root@localhost ~]# kill -1 1922 //-1信号,可以让进程重新启动
[root@localhost ~]# pstree -p | grep httpd
|-httpd(1922)-+-httpd(1953)
| |-httpd(1954)
| |-httpd(1955)
| |-httpd(1956)
| |-httpd(1957)
| |-httpd(1958)
| |-httpd(1959)
| `-httpd(1960) //httpd服务的子进程PID都改变了,说明重启成功
结束httpd服务;
[root@localhost ~]# pstree -p | grep httpd //查看httpd服务
|-httpd(1922)-+-httpd(1953)
| |-httpd(1954)
| |-httpd(1955)
| |-httpd(1956)
| |-httpd(1957)
| |-httpd(1958)
| |-httpd(1959)
| `-httpd(1960)
[root@localhost ~]# killall httpd //直接指定进程名结束进程
[root@localhost ~]# pstree -p | grep httpd //httpd服务已经正常结束
① 结束httpd服务;
[root@localhost ~]# pstree -p | grep httpd //查看httpd服务
|-httpd(2251)-+-httpd(2253)
| |-httpd(2254)
| |-httpd(2255)
| |-httpd(2256)
| |-httpd(2257)
| |-httpd(2258)
| |-httpd(2259)
| `-httpd(2260)
[root@localhost ~]# pkill httpd //直接指定进程名结束进程
[root@localhost ~]# pstree -p | grep httpd //httpd服务已经正常结束
② 踢出登录用户;
[root@localhost ~]# who //查看本机已登录的用户
root pts/0 2020-04-15 11:39 (192.168.140.1)
root pts/1 2020-04-15 13:08 (192.168.140.1) //两个root用户已经远程登录
[root@localhost ~]# pkill -9 -t pts/1 //强制杀死从pts/1虚拟终端登录的进程
[root@localhost ~]# who
root pts/0 2020-04-15 11:39 (192.168.140.1) //虚拟终端pts/1的登录进程已经被杀死
选 项 | 作 用 |
---|---|
-d 秒数 | 指定 top 命令每隔几秒更新,默认为3秒 |
-n 次数 | 指定 top 命令执行的次数 |
-b | 批处理模式,一般与"-n"选项合用,用于把top命令重定向到文件中 |
-p 进程PID | 仅监听指定 PID 的进程 |
-u 用户名 | 仅监听指定用户的进程 |
top - 19:13:02 up 7:34, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 88 total, 1 running, 87 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1004136k total, 219592k used, 784544k free, 28220k buffers
Swap: 2097148k total, 0k used, 2097148k free, 58320k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19360 1524 1228 S 0.0 0.2 0:01.50 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.04 watchdog/0
...省略部分信息
第一行为任务队列信息,与 uptime 命令执行结果相同,具体含义如下:
字 段 | 解 释 |
---|---|
19:13:02 | 系统当前时间 |
up 1 day, 7:34 | 系统的运行时间。本机已经运行1天7小时34分钟 |
1 user | 当前登录了一个用户 |
load average: 0.00, 0.01, 0.05 | 系统在1分钟内、5分钟内、15分钟内的平均负载。如果这些数值高于cpu的数量,则你的系统可能在超负荷运转 |
第二行为进程(Tasks) 信息,具体含义如下:
字 段 | 解 释 |
---|---|
88 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
87 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
第三行为 CPU(Cpu(s)) 信息,具体含义如下:
字 段 | 解 释 |
---|---|
0.3%us | 用户空间占用的 CPU 百分比 |
0.0%sy | 系统空间占用的 CPU 百分比 |
0.0%ni | 改变过优先级的进程的 CPU 百分比 |
99.7%id | 空闲 CPU 占用的 CPU 百分比 |
0.0%wa | 等待 I/O 的进程占用的 CPU 百分比 |
0.0%hi | 处理硬中断占用的 CPU 百分比 |
0.0%si | 处理软中断占用的 CPU 百分比 |
0.0%st | 虚拟时间百分比。即当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行为物理内存(Mem) 信息,具体含义如下:
字 段 | 解 释 |
---|---|
1004136k total | 物理内存的总量 |
219592k used | 己经使用的物理内存大小 |
784544k free | 空闲的物理内存大小 |
28220k buffers | 作为缓冲的内存大小 |
第五行为交换分区(Swap) 信息,具体含义如下:
字 段 | 解 释 |
---|---|
2097148k total | 交换分区的大小 |
0k used | 已经使用的交换分区的大小 |
2097148k free | 空闲交换分区的大小 |
58320k cached | 作为缓存的交换分区的大小 |
再往下所有行为系统进程信息,各字段的含义如下:
字 段 | 解 释 |
---|---|
PID | 该进程的 ID |
USER | 该进程所属的用户 |
PR | 优先级(系统内核层面的概念),数值越小优先级越高 |
NI | 优先级(nice值,用户层面的概念),数值越小、优先级越高 |
VIRT | 该进程使用的虚拟内存的大小,单位为 KB |
RES | 该进程使用的物理内存的大小,单位为 KB |
SHR | 该进程使用的共享内存大小,单位为 KB |
S | 该进程状态 |
%CPU | 该进程占用 CPU 的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 该进程共占用的 CPU 时间 |
COMMAND | 运行该进程使用的命令名 |
① 显示全部CPU核心的负载情况;
在 top 基本视图中,按下键盘数字"1",可以显示全部CPU核心的负载情况。再次按下"1",就会隐藏它们。
② 背光模式;
按下键盘"b",可以进入背光模式,默认为当前处于运行(running)态的进程加上背光。按键"y"可以对处于运行(running)态的进程加上/取消背光,按键"x"可以对排序字段加上/取消背光
③ 字段排序;
top 默认是以占用CPU的百分比来排序的,通过组合键"shift + >"或"shift + <"可以向右或向左改变排序列。
按一次"shift + >"即可以占用内存的百分比(%MEM)来进行排序。
选 项 | 作 用 |
---|---|
-a | 显示活跃和非活跃内存 |
-d | 显示各个磁盘相关统计信息 |
-D | 显示磁盘整体信息 |
-p 分区设备文件名 | 显示指定磁盘分区统计信息 |
-s | 显示内存相关统计信息和多种系统活动数量 |
-t | 将时间戳添加到输出内容中 |
-s 单位 | 使用指定单位显示。单位:k、K、m、M分别代表 1000、1024、1000000、1048576字节(bytes),默认为k(1024bytes) |
-V | 显示vmstat版本信息 |
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 584440 44204 216116 0 0 4 7 17 16 0 0 99 0 0
下表对各字段的含义进行解释:
字 段 | 选 项 | 解 释 | 说 明 |
---|---|---|---|
procs | r | 等待运行的进程数 | 数值越大,系统越繁忙。当这个值超过CPU个数,就会出现CPU瓶颈 |
b | 等待I/O的进程数量 | 数值越大,系统越繁忙 | |
memory | swpd | 已使用虚拟内存大小 | 当值大于0时,表示物理内存不足,需要考虑升级内存 |
free | 空闲内存大小 | 指物理内存空闲大小 | |
buff | 用作缓冲的内存大小 | 缓冲(buffer):用于存储速度不同步的设备或优先级不同的设备之间传输数据。向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能 | |
cache | 用作缓存的内存大小 | 缓存(cache):位于CPU和主内存之间的容量较小但速度很快的存储器,CPU速度远远高于主内存的速度,所以从中读取数据需要等待很长的时间。所以把最常用的数据保存在缓存区中,再次读取该数据时,直接从缓存中读取,减少CPU等待的时间,从而提高系统性能 | |
swap | si | 每秒从交换区写入内存的数据大小 | 表示数据由磁盘调入内存,这个数值越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差 |
so | 每秒从内存写入交换区的数据大小 | 表示数据由内存调入磁盘,数值大小影响系统的效用同 “si” | |
io | bi | 每秒读取的块数 | 现在的Linux版本块的大小为1024bytes |
bo | 每秒写入的块数 | 如果 bi+bo 的值越大,则表示系统磁盘I/O越繁忙 | |
system | in | 每秒中断数,包括时钟中断 | 这个值越大,表示系统与接口设备的通信越繁忙 |
cs | 每秒上下文切换数 | 数值大小影响系统的效用同 “in” | |
cpu | us | 用户进程消耗 CPU 运算时间的百分比 | 这个值比较高时,表示用户进程消耗的CPU时间多。如果长时间超过50%,那么我们就需要考虑优化程序算法或其他措施 |
sy | 内核进程消耗 CPU 运算时间的百分比 | 这个值比较高时,表示系统内核消耗的CPU时间多,性能方面可能有一些问题,需要我们检查原因。一般来说"us+sy"应该小于80% | |
id | 空闲 CPU 的百分比 | 如果这个值持续为0并且系统时间(cpu sy)是用户时间(cpu us)的两倍,系统则面临着CPU资源的短缺 | |
wa | 等待 I/O 所占用的 CPU 运算时间百分比 | 这个值比较高时,说明I/O等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈 | |
st | 虚拟 CPU 占用实际 CPU 运算时间的百分比 | 即虚拟机所占用的 CPU 运算时间百分比 |
使用vmstat检测系统,每隔1秒刷新一次,共刷新3次,同时输出时间戳;
[root@localhost ~]# vmstat -t 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 764164 52540 54220 0 0 12 2 11 13 0 0 99 0 0 2020-04-20 13:58:29 CST
0 0 0 764116 52540 54220 0 0 0 0 17 18 0 1 99 0 0 2020-04-20 13:58:30 CST
0 0 0 764116 52540 54220 0 0 0 0 13 14 0 0 100 0 0 2020-04-20 13:58:31 CST
选 项 | 作 用 |
---|---|
-c string | 列出以 string 开头的进程打开的文件 |
-p pid | 列出进程号为 PID 进程打开的文件 |
-u uname/uid | 列出归属 uname/uid 的进程打开的文件 |
-g gname/gid | 列出归属 gname/gid 的进程打开的文件 |
+d 目录 | 列出目录下所有被进程打开的文件 |
+D 目录 | 不但列出目录下的,同时也会搜索目录下的目录,时间较长 |
-d fd | 列出文件描述符为 fd 的进程 |
-i [4,6] [protocol] [ @hostname|hostaddr ] [ :service|port ] | 列出符合条件的进程 4,6 → IPV4 or IPV6 protocol → TCP or UDP @hostname → Internet host name hostaddr → IP地址 service → /etc/services中的service name port → 端口号 |
[root@localhost ~]# lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,3 4096 2 /
init 1 root rtd DIR 8,3 4096 2 /
init 1 root txt REG 8,3 150352 653834 /sbin/init
init 1 root mem REG 8,3 65960 261170 /lib64/libnss_files-2.12.so
...省略部分信息
下表对各字段的含义进行解释:
字 段 | 解 释 |
---|---|
COMMAND | 进程的名称 |
PID | 进程标识符 |
USER | 进程所有者 |
FD | 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 |
TYPE | 文件类型。如REG、DIR等 |
DEVICE | 指定磁盘的名称 |
SIZE/OFF | 文件的大小 |
NODE | 索引节点 |
NAME | 打开的文件确切名称 |
① 递归查看 /usr/bin 目录下所有打开的文件;
[root@localhost ~]# lsof +D /usr/lib
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
crond 1732 root mem REG 8,3 99164480 393263 /usr/lib/locale/locale-archive
bash 1823 root mem REG 8,3 99164480 393263 /usr/lib/locale/locale-archive
bash 3007 root mem REG 8,3 99164480 393263 /usr/lib/locale/locale-archive
lsof 3131 root mem REG 8,3 99164480 393263 /usr/lib/locale/locale-archive
lsof 3132 root mem REG 8,3 99164480 393263 /usr/lib/locale/locale-archive
② 查看某个文件被哪个进程调用;
[root@localhost ~]# lsof /sbin/init
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root txt REG 8,3 150352 653834 /sbin/init
③ 列出httpd服务的进程所打开的文件;
[root@localhost ~]# lsof -c httpd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 3031 root cwd DIR 8,3 4096 2 /
httpd 3031 root rtd DIR 8,3 4096 2 /
httpd 3031 root txt REG 8,3 2163426 412492 /usr/local/httpd-2.4.41/bin/httpd
...省略部分信息
④ 列出使用特定的tcp端口的进程;
[root@localhost ~]# lsof -i tcp:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 3031 root 4u IPv6 22199 0t0 TCP *:http (LISTEN)
httpd 3032 daemon 4u IPv6 22199 0t0 TCP *:http (LISTEN)
httpd 3033 daemon 4u IPv6 22199 0t0 TCP *:http (LISTEN)
httpd 3034 daemon 4u IPv6 22199 0t0 TCP *:http (LISTEN)