目录
一、查看进程
1)程序和进程的关系
程序
-
保持在硬盘、光盘等介质中的可执行代码和数据
-
文件中静态保存的代码
进程
-
在CPU及内存中运行的程序代码
-
动态执行的代码
-
父、子进程
每个程序可以创建一个或多个进程
进程特征
- 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的
- 并发性:任何进程都可以资源分配和调度的一个独立单位
- 独立性:进程是系统进行资源分配和调度的一个独立单位
- 结构性:进程由程序、数据和进程控制块三部分组成
线程
- 是进程的一个实体,更加轻量级
- 操作系统能够进行运算调度的最小单位
- 一个进程可以有很多线程,每条线程并行执行不同的任务
进程和线程的区别
- 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
- 进程之间相互独立,但同一进程的各个进程之间共享程序的内存空间
- 调度和切换:线程上下文切换比进程上下文切换要快得多
2)查看进程信息ps
①ps命令
-
查看静态的进程统计信息
常用选项
a | 显示当前终端下的所有进程信息,包括其他用户的进程 |
---|---|
u | 使用以用户为主的格式输出进程信息 |
x | 显示当前用户在所有终端下的进程信息 |
-e | 显示系统内的所有进程信息 |
-l | 使用长格式显示进程信息 |
-f | 使用完整的格式显示进程信息 |
-a | 显示现行终端下的所有进程 |
-T | 查看线程信息 |
–sort 属性 | 对属性排序,属性前加-表示倒序 |
[root@localhost ~]# ps aux
[root@localhost ~]# ps aux --sort -%cpu|head -10 //按cpu降序排列,-为降序,+为升序,p与%同义
[root@localhost ~]# ps aux --sort +pmem|head -n 10 //按内存升序排列
[root@localhost ~]# ps aux --sort -pcpu,+pmem|head -n 10
表头 | 含义 |
---|---|
USER | 该进程是由哪个用户产生的 |
PID | 进程的ID |
%CPU | 该进程占用CPU资源的百分比,占用的百分比越高,进程越消耗资源 |
%MEM | 该进程占用物理 内存的百分比,占用的百分比越高,进程越消耗资源 |
VSZ | 该进程占用虚拟内存的大小,单位为KB |
RSS | 该进程占用实际物理内存的大小,单位为KB |
TYY | 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。 |
STAT | 进程状态 -R:该进程正在运行 |
START | 该进程的启动时间 |
TIME | 该进程占用CPU的运算的时间 |
COMMAND | 产生此进程的命令名 |
僵尸进程
一个进程结束了,但是如果该进程的父进程已经结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源
但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程
[root@localhost ~]# ps -elf
[root@localhost ~]# ps -aT 显示所有线程
[root@localhost ~]# ps -T -p <pid> 查看指定进程中已经起的线程
[root@localhost ~]# ps -L <pid> 查看指定进程中的线程信息
表头 | 含义 |
---|---|
F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限; |
S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
UID | 运行此进程的用户的 ID; |
PID | 进程的 ID; |
PPID | 父进程的 ID; |
C | 该进程的 CPU 使用率,单位是百分比; |
PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改 |
ADDR | 该进程在内存的哪个位置; |
SZ | 该进程占用多大内存; |
WCHAN | 该进程是否运行。"-"代表正在运行; |
TTY | 该进程由哪个终端产生; |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
CMD | 产生此进程的命令名; |
ps:
PRI(priority):系统定义,不能设置
NI(nice):可以人为设置
修改 NI 值时有几个注意事项:
- NI 范围是 -20~19。
- 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
- 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
- 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
越小优先级越高
②top命令
- 查看动态的进程排名信息
[root@localhost ~]# top
[root@localhost ~]# top -H 显示所有线程
[root@localhost ~]# top -H -p <pid> 显示特定进程中的线程
常用参数
-d | 改变显示的更新速度,默认3秒 |
---|---|
-q | 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行 |
-c | 切换显示模式 |
-s | 安全模式,将交谈式指令取消, 避免潜在的危机 |
-i | 不显示任何闲置 (idle) 或无用 (zombie) 的行程 |
-n | 更新的次数,完成后将会退出 top |
-b | 批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内 |
常用命令
?或h | 显示交互模式的帮助 |
---|---|
c | 按照cpu的使用率排序,默认就是此选项 |
M | 按照内存的使用率排序 |
N | 按照PID排序 |
T | 按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序 |
k | 按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号 |
r | 按照 PID 给某个进程重设优先级(Nice)值 |
q | 退出top命令 |
数字1键 | 显示CPU个数和状态 |
top 命令——查看进程动态信息
第一行为任务队列信息
内 容 | 说 明 |
---|---|
23:16:21 | 系统当前时间 |
up 13:06 | 系统的运行时间.本机己经运行13 小时 6 分钟 |
2 users | 当前登录了两个用户(本地登录和终端远程各有一个) |
load average: 0.00,0.01,0.05 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数) |
第二行为进程信息
内 容 | 说 明 |
---|---|
Tasks: 140 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
139 sleeping | 睡眠的进程数 |
0 stopped | 正在停止的进程数 |
0 zombie | 僵尸进程数。如果不是 0,则需要手工检查僵尸进程 |
第三行为 CPU 信息
内 容 | 说 明 |
---|---|
Cpu(s): 0.0%us | 用户模式占用的 CPU 百分比 |
0.4%sy | 系统模式占用的 CPU 百分比 |
0.0%ni | 改变过优先级的用户进程占用的 CPU 百分比 |
99.9%id | 空闲 CPU 占用的 CPU 百分比 |
0.0%wa | 等待输入/输出的进程占用的 CPU 百分比 |
0.0%hi | 硬中断请求服务占用的 CPU 百分比 |
0.0%si | 软中断请求服务占用的 CPU 百分比 |
0.0%st | st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行为物理内存信息
内 容 | 说 明 |
---|---|
Mem: 1867024total | 物理内存的总量,单位为KB |
317032used | 己经使用的物理内存数量 |
844308 free | 空闲的物理内存数量 |
705684 buff/cache | 作为缓冲的内存数量 |
第五行为交换分区(swap)信息
内 容 | 说 明 |
---|---|
Swap: 4194300 total | 交换分区(虚拟内存)的总大小 |
O used | 已经使用的交换分区的大小 |
4194300 free | 空闲交换分区的大小 |
1341324 avail Mem | 可用内存的大小 |
缓冲(buffer)和缓存(cache)的区别:
- 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
- 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
第二部分系统进程信息
字段 | 含义 |
---|---|
PID | 进程的ID |
USER | 该进程所属的用户 |
PR | 优先级,数值越小,优先级越高 |
NI | 优先级,数值越小、优先级越高 |
VIRT | 该进程使用的虚拟内存的大小,单位为 KB |
RES | 该进程使用的物理内存的大小,单位为 KB |
SHR | 共享内存大小,单位为 KB |
S | 进程状态 |
%CPU | 该进程占用 CPU 的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 该进程共占用的 CPU 时间 |
COMMAND | 进程的命令名 |
平均负载情况
长时间80%及以上,可能处于异常
总结:
top:atop iotop htop iftop
内存: free -m vmstat atop
CPU: top vmstat atop
IO: iostat iotop vmstat atop pidsts
网卡流量: ifconfig iftop atop
磁盘使用: df du atop
进程: ps top htop atop
③pgrep命令
- 根据特定条件查询进程PID信息
pgrep -l [关键词] [-U <用户名> -t <终端名>]
[root@localhost ~]# pgrep -l "-log" //-l:显示进程名 缺省时只输出PID号
2538 rsyslogd
2113 mcelog
[root@localhost ~]# pgrep -l -U teacher -t tty2 //-U:指定特定用户 -t:指定终端
27483 bash
27584 vim
④pstree命令
- 以树形结构列出进程信息
pstree -aup [用户名]
[root@localhost ~]pstree -aup //-a:显示完整信息 -u:列出对应用户名 -p:列出对应PID号
[root@localhost ~]pstree -ap teacher //只查看属于指定用户的进程树结构
常用选项
⑤lsof命令
- 列举系统中已经被打开的文件
- 通过 lsof 命令,根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件
常用参数
选项 | 功能 |
---|---|
-c 字符串 | 只列出以字符串开头的进程打开的文件 |
+d 目录名 | 列出某个目录中所有被进程调用的文件 |
-u 用户名 | 只列出某个用户的进程打开的文件 |
-p pid | 列出某个 PID 进程打开的文件 |
⑥vmstat命令
动态的了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源
常用参数
选项 | 含义 |
---|---|
-fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明 |
-S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量 |
-d | 列出硬盘有关读写总量的统计表 |
-p 分区设备文件名 | 查看硬盘分区的读写情况 |
字段含义
字段 | 含义 |
---|---|
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 百分比 |
二、控制进程
1)进程的启动方式
手工启动
-
前台启动:用户输入命令,直接执行程序
-
后台启动:在命令行尾加入“&”符号
[root@localhost ~]#cp /dev/cdrom mycd.iso &
[1] 28454 //输出信息中包括后台任务序号、PID号
调度启动
-
使用at命令,设置一次性计划任务
-
使用crontab命令,设置周期性计划任务
2)进程的前后台调度
命令 | 含义 |
---|---|
Ctrl+Z组合键 | 将当前进程挂起,即调入后台并停止执行 |
jobs [-l] | 查看处于后台的任务列表 |
fg+序号 | 将后台的进程恢复到前台运行,可指定任务序号 |
bg+序号 | 重新开始任务 |
Ctrl+C组合键 | 中断正在执行的命令 |
[root@localhost ~]# jobs
[1]- Stopped cp /dev/cdrom mycd.iso
[2]+ Stopped top
[root@localhost ~]# fg 1
示例:
3)终止进程的运行
①Ctrl+C组合键
- 中断正在执行的命令
②kill、killall命令
- kill用于终止指定PID号的进程
- killall用于终止指定名称相关的所有进程
- -9选项用于强制终止
kill <PID>
-s <信号名> <PID>
SIGTERM -15
SIGKILL -9
SIGQUIT -3
SIGHUP -1
killall <进程名>
常用选项:
参数 含义
-i 交互,询问是否杀死
-l 忽略进程名的大小写
信号编号 | 信号名 | 含义 |
---|---|---|
0 | EXIT | 程序退出时收到该信息 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化 |
2 | INT | 表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号 |
3 | QUIT | 退出 |
9 | KILL | 杀死进程,即强制结束进程 |
11 | SEGV | 段错误 |
15 | TERM | 正常结束进程,是 kill 命令的默认信号 |
示例:![](https://i-blog.csdnimg.cn/blog_migrate/5673b290cb24ff7879a1804a02077122.png)
③pkill命令
- 根据特定条件终止相应的进程
- 常用命令选项
-U:根据进程所属的用户名终止相应进程
-t: 根据进程所在的终端终止相应进程
pkill <关键词> [-U <用户名> -t <终端名>]
[root@localhost ~]# pgrep -l -U "teacher"
3045 bash
[root@localhost ~]#pkill -9 -U "teacher"
[root@localhost ~]#pgrep -l -U "teacher"
示例:
三、at一次性任务设置
at命令
- 一次性计划任务
- 由包 at 提供
- 依赖与atd服务,需要启动才能实现at任务
- at队列存放在/var/spool/at目录中,ubuntu存放在/var/spool/cron/atjobs目录下
- 执行任务时PATH变量的值和当前定义任务的用户身份一致
at 命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,具体规则如下:
- 如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令(注意,/etc/at.allow 文件的优先级更高,也就是说,如果同一个用户既写入 /etc/at.allow 文件,又写入 /etc/at.deny 文件,那么这个用户是可以使用 at 命令的)
- 如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件(黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效
- 如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令
系统中默认只有 /etc/at.deny 文件,而且这个文件是空的,因此,系统中所有的用户都可以使用 at 命令。不过,如果我们打算控制用户的 at 命令权限,那么只需把用户写入 /etc/at.deny 文件即可
at [HH:MM] [yyyy-mm-dd]
[root@localhost ~]# date
Sun May 7 10:33:13 EDT 2017
[root@localhost ~]# at 10:35 2017-05-07
at> pgrep -U root |wc -l>/tmp/ps.root
at> <EOT> //按Ctrl+D键提交任务
job 1 at Sun May 7 10:35:00 2017
[root@localhost ~]# cat /tmp/ps.root
202
常用参数
atq | 查看系统中的等待作业 |
---|---|
-d | 删除系统中的等待作业(等效于atrm命令) |
-c | 打印任务的内容 |
-q | 使用指定的列队 |
-f | 将指定文件提交等待作业 |
-t | 以时间的形式提交运行作业 |
案例
- 在当天的21:30时自动关闭当前系统
[root@localhost ~]#at 21:30 //不携带日期表示当天
at> shutdown -h now
at> <EOT> //按Ctrl+D键提交任务
job 2 at Sun May 7 21:30:00 2017
[root@localhost ~]#atq //查看未执行的任务列表
2 Sun May 7 21:30:00 2017 a root
[root@localhost ~]#atrm 1 //删除第1条任务
[root@localhost ~]#atq
示例
四、crontab周期性任务设置
crontab命令
- 按照预先设置的时间周期(分钟、小时、天、月、周)重复执行用户指定的命令操作
- 属于周期性计划任务
- 主要设置文件
- 全局配置文件,位于文件:/etc/crontab
- 系统默认的设置,位于目录:/etc/cron.*/
- 用户定义的设置,位于文件:/var/spool/cron/用户名
- 启动周期性任务有一个前提条件,即对应的系统服务crond必须已经运行
- 全局配置和系统默认配置中的内容一般不需要用户去修改,用户只需设置/var/spool/cron/目录下与本账号同名的文件即可
管理crontab计划任务
- 编辑计划任务
crontab -e [-u 用户名] //-u缺省时默认时针对当前用户
- 查看计划任务
crontab -l [-u 用户名]
- 删除计划任务
crontab -r [-u 用户名]
常用参数
-e | 编辑该用户的计时器设置 |
---|---|
-l | 列出该用户的计时器设置 |
-r | 删除该用户的计时器设置 |
-u | 指定要设定计时器的用户名称 |
–help | 显示帮助信息 |
示例![](https://i-blog.csdnimg.cn/blog_migrate/aa725ee41f74a41694d87d18c115baed.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ba0ae4b7672022418e2160269317abf1.png)
配置格式
字段 | 说明 |
---|---|
分钟 | 取值0-59任意整数 |
小时 | 取值0-23任意整数 |
日期 | 取值1-31任意整数 |
月份 | 取值1-12任意整数 |
星期 | 取值0-7任意整数,0或7都代表星期天 |
命令 | 要执行的命令或程序脚本 |
符号 | 说明 |
---|---|
* | 表示该范围内的任意时间 |
, | 表示间隔的多个不连续的时间点 |
- | 表示一个连续的时间范围 |
/ | 指定间隔的时间频率 (写在第一个 */2 每隔2分钟) |