目录:
一 : 进程概述
1.1 什么是进程
1.2 进程的分类
1.3 linux的5中常见进程状态
二:统计进程信息
2.1 ps 静态统计
2.2 top 动态统计
2.3 pgrep 查看特定进程
2.4 pstree 查看进程树
三:进程的启动方式
3.1 手工启动
3.2 调度启动
四:进程的调度和 结束进程
4.1 进程的前后台调度
4.2 结束进程
一:进程概述
1.1 什么是进程
要知道什么是进程,就要先知道程序是什么。简单来说,程序就是一系列可执行的代码。而当那一串代码被执行,即程序被运行,其所产生的就叫进程,一个程序可以创建一个或多个进程。简单说,进程就是动态执行的代码。是资源分配的最小单位
1.2 进程的分类
Linux 中 根据进程的特点,把进程可以分为三类:交互进程、批处理进程和守护进程。
(1) 交互进程:是由shell启动的进程,它既可以在前台运行,也可以在后台运行。
(2)批处理进程:和终端没有联系,是一个进程序列。该进程负责按照顺序启动其它进程。
(3)守护进程:是是执行特定功能或者执行系统相关任务的后台进程。
根据进程状态,可以分为 守护进程,孤儿进程,僵尸进程
(1)守护进程:没有控制终端,父进程都是init进程(PID为1)
(2)孤儿进程:父进程退出后,其子进程还在运行,这些子进程成为孤儿进程。孤儿进程将会被init(PID=1) 进程收养,有init进程对他们完成状态收集工作
(3)僵尸进程:当子进程比父进程先结束时,却又没有完全释放内存,该进程就成为僵尸进程。僵尸进程父进程结束后,僵尸进程就会被init进程收养,最终回收。
#孤儿进程不会导致资源浪费,但是,僵尸进程会导致资源浪费。
1.3 Linux 的 5中常见进程状态
linux有 5 中常见进程状态 运行 , 中断 ,不可中断 , 僵死, 停止
进程状态
|
含义
|
对应的ps命令的状态
|
运行
|
正在运行或者在运行队列中等待。
可执行状态
|
R 运行 runnable
|
中断
|
休眠中,受阻,在等待某个条件的形成或者接受到。
可中断的睡眠状态
|
S 中断 (sleeping)
|
不可中断
|
收到信号不唤醒和不可运行,进程必须等待直到有中断发生。
不可中断的睡眠状态
|
D 不可中断 (uninterruptible sleep)
|
僵死
|
进程已终止,但进程描述符存在,直到父进程调用wait4() 系统调用后释放。
退出,成为僵尸进程
|
Z 僵死 (zombie)
|
停止
|
进程收到sigstop ,sigstp,sigtin,sitout 信号后停止运行.
停止状态,或者跟踪状态
|
T 停止 task_stopped or task_traced
|
## X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。当进程在退出过程中,没有保留它的 task_struct ,此时就处于EXIT_DEAD。此状态非常短暂,几乎不可能被ps 命令捕捉
二: 统计进程信息
2.1 ps 命令 查看静态的进程统计信息
(1) ps aux
常用选项
a : 显示中断上的所有进程,包括其他用户的进程
u :列出进程的用户
x :显示所有终端的进程
字段解释:
USER : 启动进程的用户
PID : 进程的ID
%CPU : 进程占用的cpu 百分比
%MEM: 进程占用的内存百分比
VSZ : 进程占用的虚拟内存(KB)
RSS : 进程占用的物理内存(KB)
TTY : 启动进程的终端。不是从终端启动的则为?
STAT : 进程的状态。 (D :不可中断睡眠状态 ,S:可中断睡眠状态 ,R:可执行/运行状态 ,Z :僵死转态 ,T :停止转态或者追踪状态)
START: 进程被触发时间
TIME : 该进程实际使用cpu时间
COMMAND : 进程的启动命令
(2) ps -elf
-e :显示系统内的所有进程新型
-l : 长格式显示进程信息
-f : 使用完整的格式显示进程信息
-a : 显示所有进程的pid
-T : 查看线程的信息
#如果要查看线程的信息,可以使用 ps -aT 命令
字段解释:
F :内核分配给进程的系统标记
S : 进程的状态
UID : 启动进程的用户
PID :进程ID
PPID : 进程的父进程ID
C :进程生命周期的cpu利用率
PRI : 进程的优先级(数字越大,优先级越低)
NI : 谦让度值,用来参与决定优先级
ADDR :进程的内存地址
SZ : 所需交换空间大小
WCHAN :如果该进程睡眠,显示睡眠中的系统函数名
STIME :进程启动时的系统时间
TTY : 进程启动时的终端设备
TIME :进程占用的累计CPU时间
CMD :进程的启动命令
2.2 top 命令动态查看进程排名信息
top 命令 会进入一个交互界面,按下ctrl +c 或者 q 键 退出
第一行是:任务队列信息
10:40:49 ##系统时间
up 2:03 ##系统运行时长
1 user ##当前登录用户数
load average: 0.00 ,0.01 ,0.02
##系统负载,依次是 1分钟内,5分钟内,15 分钟内 到现在的平均值。一般该值最好小于 CPU总核心数*0.7
第二行:进程信息
Tasks #总进程数
running #正在运行的进程数
sleeping #休眠的进程数
stopped #中止的进程数
zombie #僵死的进程数
第三行:Cpu 信息 (显示的是所有cpu总和的信息。按 1 键,可以看到每个cpu的信息,按大写P 键可以按cpu 使用的降序排列)
us ##用户占用
sy ##系统占用
ni ##优先级调度占用
id ## 空闲cpu 占比
wa ## I/O 读写等待占用
hi ##硬件中断占用
si ##软件中断占用
st ##虚拟化占用
第四行: 内存的信息( 按下大写M ,根据使用内存大小 进行 降序排列)
total ##总内存空间
free ##空闲内存
used ##已使用内存
buff/cache ##物理内存和交换内存缓存区总和
第五行: 交换空间信息
total ##总交换空间大小
free ##空闲交换空间
used ##已使用交换空间
avail Mem ##可用物理内存大小
进程信息区各列解释
PID #进程id
USER #启动进程的用户
PR #优先级
NI #谦让度
RES #进程使用的虚拟内存总量(kb)
SHR #共享内存大小 (kb)
S #进程状态
%CPU #上次更新到现在cpu使用占比
%MEM #内存使用占比
TIME+ #进程使用的cpu时间总计,精确到 毫秒
COMMAND #启动进程的命令
top 交互界面常用操作
P 键: 根据CPU 降序排列
M 键:根据内存降序排列
N 键: 根据启动时间降序排列
c 键: 切换显示命令名称和完整命令行
h 键:可以获得top 程序的帮助信息
k 键: 根据提示输入进程的pid 号,按enter 键, 可以 终止 对应的进程
q 键: 退出top 交互界面
数字1 键: 显示 每个cpu 的状态
top -H : 显示所有线程
top -H -p <pid> : 显示特定进程中的线程
2.3 pgrep 查看特定进程信息
pgrep -l 显示进程名。如果没有,只显示PID号
[root@localhost ~]# pgrep -l httpd #列出httpd 的进程
4284 httpd
4286 httpd
4287 httpd
4288 httpd
4289 httpd
4290 httpd
[root@localhost ~]# pgrep -l -U test #列出test 用户的进程,并显示进程名 4331 bash 4370 top [root@localhost ~]# pgrep -l -G root #列出 root 组 的进程,并显示进程名 1 systemd 2 kthreadd 3 ksoftirqd/0 5 kworker/0:0H 6 kworker/u256:0 [root@localhost ~]# pgrep -l -t pts/2 #列出 终端pts/2 的进程 5192 bash 5291 top [root@localhost ~]# pgrep -l -a httpd #列出httpd 进程的命令 4284 /usr/sbin/httpd -DFOREGROUND 4286 /usr/sbin/httpd -DFOREGROUND 4287 /usr/sbin/httpd -DFOREGROUND 4288 /usr/sbin/httpd -DFOREGROUND 4289 /usr/sbin/httpd -DFOREGROUND 4290 /usr/sbin/httpd -DFOREGROUND
2.4 pstree 查看进程树
pstree 以树形结构列出进程信息
pstree [选项] [用户名]
选项
-a : 显示完整信息
-u : 列出对应用户名
-p : 列出对应的PID名
[root@localhost ~]# pstree -aup #以树状图列出所有进程,并显示完整信息和对应用户名和PID 名 systemd,1 --switched-root --system --deserialize 21 ├─ModemManager,577 │ ├─{ModemManager},601 │ └─{ModemManager},625 ├─NetworkManager,665 --no-daemon │ ├─{NetworkManager},674 │ └─{NetworkManager},679 ├─VGAuthService,576 -s ├─abrt-watch-log,583 -F BUG: WARNING: at WARNING: CPU:INFO: possible recursive locking d ├─abrt-watch-log,635 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD ├─abrtd,582 -d -s ├─accounts-daemon,637 │ ├─{accounts-daemon},641 │ └─{accounts-daemon},648 [root@localhost ~]# pstree -aup test # 以树状图查看 用户 test 的进程 bash,4331 └─top,4370
三: 进程的启动方式
3.1 手工启动
(1) 前台启动: 用户输入命令,直接执行程序
(2)后台启动: 在命令行尾加上“&” 符号
[root@localhost opt]# ls #前台启动ls 命令 rh [root@localhost opt]# sleep 10 #前台启动sleep 命令 [root@localhost opt]# sleep 10 & # 后台启动sleep命令 [1] 5529 #显示的是后台命令的序号和进程号 [root@localhost opt]#
3.2 调度启动
(1) 使用at 命令 设置一次性计划任务
(2) 使用crontab 命令设置周期性计划任务
3.2.1 at 命令使用
at [HH:MM] [yyyy-mm-dd] #设置计划任务
[root@localhost opt]# date 2021年 06月 24日 星期四 11:42:29 CST [root@localhost opt]# at 11:45 2021-06-24 #在2021-06-24 11:25 分执行计划任务,当天执行,年月日可以省略 at> pgrep -U root | wc -l > /tmp/ps.root #执行的计划 (命令) at> <EOT> #按 ctrl + D 提交任务 job 1 at Thu Jun 24 11:45:00 2021
atq #查看未执行的任务列表
atrm 序号 #删除任务
[root@localhost opt]# atq #查看为执行的计划任务 5 Thu Jun 24 12:00:00 2021 a root #编号 [root@localhost opt]# atrm 5 #删除编号为 5 的计划任务 [root@localhost opt]# atq
3.2.2 crontab 设置周期性计划任务
能够周期性的按照预先设置的时间周期(分 ,时 , 日, 月,周) 重复执行用户指定的命令操作
(1) 下载cronie 和 crontabs 软件包,并启用服务,设置为开机自启
[root@localhost ~]# yum -y install cronie crontables #下载软件包 [root@localhost ~]# systemctl start crond #启动crond
[root@localhost ~]# systemctl enable crond #将crond 服务设置为开机自启
(2) 编辑计划任务
crontab -e [-u 用户名] # -u 缺省,默认是当前用户
[root@localhost ~]# crontab -e 30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d) #每月每天 01 点 30 分 执行 cp -a /var/log/messages /root/log-$(date +%Y-%m-%d) 命令
crontab 主要有三个配置文件,
全局配置文件: 位于文件 /etc/crontab
系统默认的设置: 位于目录/etc/cron.*/
用户定义的设置: 位于文件 /var/spool/cron/用户名
crontab 的命令实际是在编写 /var/spool/cron/用户名 这个文件,所以我们也可以直接编写 该文件,设置计划任务
或者 编写 全局配置文件 /etc/crontab
通过编写 /var/spool/cron/root文件的方式
[root@localhost ~]# echo ‘30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d)‘ > /var/spool/cron/root [root@localhost ~]# vim /var/spool/cron/root 30 1 * * * cp -a /var/log/messages /
root/log-$(date +%Y-%m-%d)
通过编写 /etc/crontab 的方式编写 ,这种方式 只有root 才可以
[root@localhost ~]# vim /etc/crontab 30 2 * * * root cp -a /var/log/messages /root/log-$(date +%Y-%m-%d) #要在时间后面加上 指定的用户
配置格式:
字段 | 说明 |
分钟 | 取值为0到59 之间的任意整数 |
小时 | 取值为0到23 的任意整数 |
日期 | 取值为1 到31 的任意整数 |
月份 | 取值为 1 到12 的任意整数 |
星期 | 取值为 0到 7 之间任意整数。 0 或 7 代表周日 |
命令 | 要执行的命令或者程序脚本 |
时间数值的特殊表示方法
表示 | 含义 | 例子 |
* | 表示该范围内任意的时间 | 0 1 * * * 每天的凌晨1点 |
, | 表示 间隔的多个不连续时间点 | 30 8,10 * * * 每天的8点30 和10 点30 |
- | 表示 一个连续的时间范围 | 30 8-10 * * * 每天的 8点30 分 到 10 点 30 分 |
/ | 表示间隔的时间频率 | 30 */2 * * * 每天都每隔两小时,在30分钟时候 |
(3) 查看计划任务
crontab -l [-u 用户名]
[root@localhost ~]# crontab -l #查看当前用户(root) 的计划任务 30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d)
(4) 删除
crontab -r [-u 用户名] #清空用户所有计划任务
crontab -e #进入编辑界面后,手动一条一条的精确删除
[root@localhost ~]# crontab -r [root@localhost ~]# crontab -l no crontab for root
四:调度进程与结束进程
4.1 进程的前后台调度
(1) Ctrl + Z 键组合
将当前进程挂起。即调入后台,并停止执行
root@localhost opt]# vim a.txt #再按下 ctrl +z 键 [1]+ 已停止 vim a.txt
(2)jobs [ -l ] 命令
查看处于后台的任务列表
[root@localhost opt]# jobs [1]+ 已停止 vim a.txt [root@localhost opt]# jobs -l # jobs -l 可以显示进程的pid 号 [1]+ 4666 停止 vim a.txt
(3) fg 命令
将后台进程恢复到前台运行,可以指定任务序号
[root@localhost opt]# jobs -l #查看后台进程 [1] 4666 停止 vim a.txt [2]- 4714 停止 sleep 1000 [3]+ 4715 停止 (信号) top [root@localhost opt]# fg 3 #将编号为3的进程恢复到前台执行 [root@localhost opt]# fg #不加编号默认恢复最后一个 sleep 1000 [root@localhost opt]# jobs -l [1]+ 4666 停止 vim a.txt
4.2 结束进程
(1) Ctrl +c键 组合
中断正在执行的命令
[root@localhost opt]# sleep 100 #按下ctrl +c 键可以结束 此次 睡眠
^C
(2) kill 和 killall 命令
kill 用于终止 指定PID 号的进程
killall 用于 终止指定名称相关的所有进程
-9 选项 用于强制终止
[root@localhost opt]# sleep 100 & [2] 4766 [root@localhost opt]# kill 4766 #终止 pid 号为 4766 的进程 [root@localhost opt]# jobs -l [1]+ 4666 停止 vim a.txt [2]- 4766 已终止 sleep 100 [root@localhost opt]# killall vim #终止所有的vim 进程 [root@localhost opt]# jobs -l [1]+ 4666 停止 vim a.txt #没有成功终止,依旧是后台停止状态 [root@localhost opt]# killall -9 vim #强制 终止 所有的 vim 进程
[1]+ 已杀死 vim a.txt oot@localhost opt]# top & [1] 4785 [root@localhost opt]# killall top #终止 所有的 top 进程 [1]+ 已停止 top
# 注,killall 是终止所有的 同名进程 ,包括其他用户 执行的 。会造成 误终止进程
(3) pkill 命令
pkill 命令可以根据特定的条件终止相应的进程
常用命令选项
-U :根据进程所属的用户名终止相应的进程
-G : 根据进程所属组 终止相应进程
-t : 根据进程所在的终端终止相应的进程
[root@localhost opt]# pgrep -l -U test #查看test 用户的进程 4859 bash 4898 top [root@localhost opt]# pkill -U test #终止用户 test 的进程 [root@localhost opt]# pgrep -l -U test 4859 bash [root@localhost opt]# pgrep -l -G test #查看test 组 的进程 4859 bash 4938 sleep [root@localhost opt]# pkill -G test #终止 test 组的进程 [root@localhost opt]# pgrep -l -G test 4859 bash