12.1 进程概述
进程: 进⾏中的程序
程序和进程之间的关系
程序 ---- 静态 (程序员书写代码)--- 存储在硬盘中,没有被加载进内存
进程 ---- 动态 (运⾏了程序 - 程序被加载进⼊到了内存) 进⾏中的程序
进程区分前台和后台
1.进程查看
2.终⽌进程
3.进程前台后台调
进程查看:
ps aux
ps -ef
ps -le
pstack
pstree -a/-p
12.2 进程查看 - BSD (Linux)
1.判断系统中运⾏进程数量
2.判断服务器运⾏健康状态
ps (process show) - Unix ( -> AT&T System-v | BSD)
不同⽤户有不同ps使⽤习惯
ps BSD 用法
ps linux / GNU ⽤法
[clh@localhost ~]$ ps aux | head -2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193972 7028 ? Ss 00:18 0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193820 7008 ? Ss 00:18 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
USER - 该进程的所有者
PID - 进程ID process ID
%CPU 物理CPU百分⽐利⽤率
%MEM 物理内存百分⽐利⽤率
VSZ Virtualmemory SiZe 虚拟内存大小 - 使用量(KB)
RSS 固定驻留物理内存量 KB
TTY 该进程所在的终端 (? 该进程直接通过内核产⽣,不是通过终端方式产生)
STAT 进程状态 (重要状态 R/S/D/T/Z)
START 该进程启动时间
TIME 该进程占⽤CPU时间分⽚
COMMAND 产⽣该进程时所使⽤的命令
ps BSD 用法
ps aux # 查看系统进程
a : 显示所有前台进程
x : 显示所有没有控制终端的后台进程
u : 以进程产⽣者的格式显示运⾏状态
12.3 进程状态 process state
#* 进程必须监听信号 (特殊进程除外)
#* 进程分 - 父进程-子进程 ,正常情况 , 父进程关闭后,子进程会自动关闭
#* 进程区分优先级
#* 进程申请资源最小单位 , 一个进程分为多个线程, 一个进程内的多个线程共享当前进程的资源
#进程状态
PROCESS STATE CODES
R : 该进程正在CPU上执⾏,或者正在等待执⾏
T : 进程被暂停,该进程可以通过接收内核发送信号继续恢复执⾏
Z : 僵尸进程 ,父进程关闭后,子进程没有⾃动关闭 。
X : 僵尸进程进程被父进程正常关闭彻底释放。 僵尸进程正常退出
s(⼩) :领导者进程,在该进程下包含子进程
< : 高优先级进程
N : 低优先级进程
+ : 该进程位于后台
l(⼩) :该进程包含了多个线程
# 睡眠状态
S : 普通睡眠 sleeping , 可以被唤醒/激活
D : 不可中断的睡眠内存, 不可以被唤醒/激活
K : 该进程如果处于任务等待中时可以被唤醒/激活
I: D - ⼦状态 , 内核不统计I状态的负载平均值
12.4 进程查看 - System-v-Unix (Linux)
ps -ef
-e 查看所有进程
-f 全部信息输出 ful
[clh@localhost ~]$ ps -ef | head -2
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:18 ? 00:00:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
UID 进程所有者
PID 进程ID
PPID 表示当前子进程的父ID
C 物理CPU百分⽐利⽤率
STIME 该进程启动时间
TTY 该进程所在的终端 (? 该进程直接通过内核产⽣,不是通过终端⽅式产⽣)
TIME 该进程占⽤CPU时间分⽚ CMD 产⽣该进程时所使⽤的命令
[root@centos7 ~]# pstack 61883 # 查看进程内的线程数量,线程内函数运⾏状态 (代码)
[root@centos7 ~]# pstree #查看进程树
[root@centos7 ~]# pstree -a #查看进程树同时查看详细信息
[root@centos7 ~]# pstree -p #查看进程树同时查看进程ID
12.5 进程查看 - Linux原生
ps -le
-e 查看所有进程
-l 全部信息以长格式输出
[clh@localhost ~]$ ps -ef | head -2
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:18 ? 00:00:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
[clh@localhost ~]$ ps -le | head -2
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 48493 ep_pol ? 00:00:05 systemd
F 内核为进城分配到的标记
S process state 进程状态
UID 进程所有者UID
PID 进程ID
PPID 表示当前⼦进程的⽗ID
C 物理CPU百分⽐利⽤率
PRI - 进程优先级,数值越小-优先级越高,进程优先级越高进程越优先执行
NI - Nice 调整进程优先级的修正量, 通过该参数决定进程优先级
ADDR 进程的内存地址 -
SZ 假如该进程需要进⾏SWAP交换,需要多大的交换空间- KB
WCHAN 该进程在进⼊到睡眠状态下所使用函数
TTY 该进程所在的终端 (? 该进程直接通过内核产生,不是通过终端⽅式产生)
TIME 该进程占⽤CPU时间分⽚
CMD 产⽣该进程时所使⽤的命令
12.6 进程动态查看
top命令
[clh@localhost ~]$ top # 动态查看进程
[clh@localhost ~]$ top -d 1 # 动态查看进程 动态刷新时间1S
# q 退出
# P 按照CPU使⽤量排序
# M 按照内存使⽤量排序
# N 按照进程ID排序
[clh@localhost ~]$ top #5行12列
top - 22:21:00 up 22:02, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 224 total, 1 running, 223 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 2.9 sy, 0.0 ni, 97.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0
KiB Mem : 2027856 total, 69492 free, 1032208 used, 926156 buff/cache
KiB Swap: 2097148 total, 2091764 free, 5384 used. 801452 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
415 root 20 0 0 0 0 S 5.9 0.0 0:03.54
20160 clh 20 0 162100 2264 1528 R 5.9 0.1 0:00.04
1 root 20 0 193972 5844 3016 S 0.0 0.3 0:05.57
#第一行-top
top - 22:21:00 up 22:02, 3 users, load average: 0.00, 0.01, 0.05
22:21:00 - 当前系统时间
up 22:02 - 系统从开机-使⽤时间
3 users 表示当前登录到系统的⽤户的数量
load average: 0.00, 0.01, 0.05 : 负载平均值 - CPU在最后1分钟/5分钟/15分钟 平均利⽤率
#第二行 Tasks
Tasks: 224 total, 1 running, 223 sleeping, 0 stopped, 0 zombie
224 total: 系统当前总进程数量
1 running : 系统当前正在运行的进程数量
223 sleeping : 系统中睡眠状态的进程数量
0 stopped : 处于暂停状态下的进程数量
0 zombie : 僵⼫进程数量
#第三行- %Cpu(s):
%Cpu(s): 0.0 us, 2.9 sy, 0.0 ni, 97.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0
0.0 us: ⽤户态进程占⽤CPU百分⽐
2.9 sy :内核态进程占⽤CPU百分⽐
0.0 ni : 进程通过nice进⾏优先级修正的百分⽐
97.1 id:当前CPU空闲百分⽐
0.0 wa :等待进⾏I/O进程所占的百分⽐
0.0 hi : 硬件中断请求 百分⽐
0.0 si : 软件中断请求 百分⽐
0.0 st : hypervisor管理程序从虚拟机窃取时间 - 虚拟化
#第四行- KiB Mem:
KiB Mem : 2027856 total, 69492 free, 1032208 used, 926156 buff/cache
2027856 total: 物理总内存数量 KB
69492 free : 闲置物理内存数量
1032208 used : 已经使⽤的内存数量
926156 buff/cache : 内存缓冲区大小(和硬盘数据交互缓存)
闲置物理内存数量 + 已经使用的内存数量 + 内存缓冲区大小 = 物理总内存数量
[clh@localhost ~]$ free #查看系统相关的内存信息
total used free shared buff/cache available
Mem: 2027856 1032276 69392 23540 926188 801380
Swap: 2097148 5384 2091764
[clh@localhost ~]$ free -m # 单位以M显示
total used free shared buff/cache available
Mem: 1980 1007 67 22 904 782
Swap: 2047 5 2042
#第五行- KiB Swap:
KiB Swap: 2097148 total, 2091764 free, 5384 used. 801452 avail Mem
# Swap 内存交换分区 --- 位于硬盘上的⼀个分区
2097148 total : 总内存交换分区数量
2091764 free : 闲置未使⽤内存交换分区数量
5384 used : 使⽤的内存交换分区数量
801452 avail Mem - 启用新的应用程序估计可以使用的物理内存数量
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID 进程ID
USER 开启该进程的⽤户
PR 进程优先级
NI NICE值
VIRT 虚拟内存的使用数量
RES 固定驻留物理内存量
SHR 共享存储使用量
%CPU 当前进程使用物理CPU百分比
%MEM 物理内存百分比
TIME+ 使用CPU时间累积
COMMAND 产⽣该进程使用的命令
12.7 杀死进程-进程关闭 终止进程 kill killall/pkill
# kill 命令
kill [-signal ID / NAME] 进程ID
[clh@localhost ~]$ kill 20982
[clh@localhost ~]$ cat /dev/zero
已终止
[clh@localhost ~]$ 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
[root@centos7 ~]# kill -15 87191
[root@centos7 ~]# kill -term 87254
[clh@localhost ~]$ kill -kill 21529
[clh@localhost ~]$ cat /dev/zero
已杀死
15) SIGTERM -> 正常关闭掉进程
9) SIGKILL -> 强制关闭掉进程
1) SIGHUP -> 重启进程
18) SIGCONT 恢复信号
19) SIGSTOP 暂停信号
#进程不建议使用 kill 方式重启, 建议通过服务的方式重启
#通过进程名称方式killall
[root@centos7 tom]# killall firefox
[root@centos7 tom]# killall -I Firefox # -I 忽略大小写
#通过进程名称方式pkill
[root@centos7 tom]# pkill firefox
# 踢掉用户
[root@centos7 tom]# pkill -t -9 pts/3
12.8 作业调度-前后台管理 fg bg nohup
# ctrl+z 把前台正在运行的任务 --- 暂停--调度到后台进行作业(job)
命令:
frontend-ground - fg
backend-ground - bg
[clh@localhost ~]$ firefox #Firefox运行,占用命令行终端前端,此时按ctrl+z出现如下:
[1]+ 已停止 firefox
[clh@localhost ~]$ jobs #查看后台任务
[1]+ 已停止 firefox
[clh@localhost ~]$ cat /dev/zero
^Z #ctrl+z
[2]+ 已停止 cat /dev/zero
[clh@localhost ~]$ cat /dev/zero >> /dev/null
^Z #ctrl+z
[3]+ 已停止 cat /dev/zero >> /dev/null
[clh@localhost ~]$ jobs #查看后台作业进程
[1] 已停止 firefox
[2]- 已停止 cat /dev/zero
[3]+ 已停止 cat /dev/zero >> /dev/null
[clh@localhost ~]$ fg %2 # 将cat /dev/zero切换到前台运行,% 表示后台作业号
cat /dev/zero #此时cat /dev/zero在前台运行,终端无法继续使用其他命令了
[clh@localhost ~]$ bg %3 # 将cat /dev/zero >> /dev/null处于后台运行
[3]+ cat /dev/zero >> /dev/null & #进程在后台运行,&
[clh@localhost ~]$ jobs
[1]+ 已停止 firefox
[3]- 运行中 cat /dev/zero >> /dev/null &
[clh@localhost ~]$ fg %1 #将firefox调到前台运行
firefox
[clh@localhost ~]$ kill -19 %3 #将cat /dev/zero >> /dev/null 停止,原在后台运行
[3]+ 已停止 cat /dev/zero >> /dev/null
[clh@localhost ~]$ kill -18 %3 #将cat /dev/zero >> /dev/null 恢复运行
[clh@localhost ~]$ kill -9 %3 #将cat /dev/zero >> /dev/null进程杀死
[3]+ 已杀死 cat /dev/zero >> /dev/null
[clh@localhost ~]$ firefox & #启动firefox 直接后台运行
[1] 30779
[clh@localhost ~]$ cat /dev/zero >> /dev/null & #创建进程时,直接在后台运行
[2] 31107
[clh@localhost ~]$ nohup firefox & #脱钩作业,此时关闭掉命令行终端Firefox仍能继续运行,因为原来的父进程是命令行终端,关掉命令行终端它的父进程会向上找到父进程的父进程。
12.9 守护进程 - deamon
#1.守护某个服务的进程 - 守护进程 (web服务 - httpd守护进程 (http deamon )/ sftp服务 --- vsftpd守护进程)
特点:
#2.运行在后台
#3.独立于终端 shell (pts/tty/:0) -> ? | 终端关闭-该进程仍可以运⾏
#4.周期性执⾏某种任务
#5.守护进程的⽗进程通常情况下PID=1进程 (systemd / init)
#6.守护进程通常以 xxxd结尾 (deamon), (pstree 可以看到运行了很多以d结尾的守护进程)
#7.守护进程的⽗进程即使被杀掉,该进程仍然可以继续运⾏,并且不会产⽣僵⼫进程。
#8.守护进程通常服务编写者在书写服务代码直接构建守护进程代码。 -> 此类服务在开启是会⾃动开启守护进程。
1.命令实现 (IP)
2.代码构建 (IE)
12.10 进程优先级-nice , renice
进程优先级数值越大 - 优先级越低
默认优先级PRI值-系统自动判断
可以通过nice , renice方式调整
#创建进程 - 调整进程优先级
#nohup nice -n 10 ./shi_keepalived &
#重新调整进程优先级 [root@centos7 ~]# renice -n -20 8689 8689 (process ID) old priority 18, new priority -20 普通⽤户 只可以将nice数值调⼤ , 1 到 19 root⽤户 可以调整数值 -20 到19