Linux进程管理
ps -- 静态查看进程
ps -elf 或 ps aux
-e:显示所有进程,环境变量
-l:代表长格式
-f:代表完整的格式
a:显示所有用户的所有进程
u:显示进程的拥有者
x:和a一起使用,显示所有进程(包含无控制终端的进程) TTY为?的进程
ps -elf与ps aux 查询目的是一样的, 显示所有在运行的进程, 前者是用bsd的格式输出,后者是用标准格式输出。
bsd格式: UID , PID , PPID , C , STIME , TTY , TIME , CMD
标准格式: USER , PID , %CPU , %MEM , VSZ , RSS , TTY , STAT , START , TIME , COMMAND
使用ps aux查询中的STAT表示进程状态:
R:该进程正在运行
S:休眠进程
Z:僵尸进程,实际上该进程已经终止,但是它的父进程却无法正常终止它,造成僵尸进程的状态
T:该进程正在跟踪或者已经停止
top -- 动态查看进程
命令中各选项的含义如表所示。
在top命令的显示窗口中,还可以使用表所示的按键,进行一些交互操作。
监控列表的详细解析
统计信息区(系统资源信息区)前五行,即列表上方的五行
第一行:输出系统任务队列信息
- 18:46:38: 系统当前时间
- up 2days 1:54: 系统开机后到现在的总运行时间
- 1 user: 当前登录用户数
- load average: 0, 0.01, 0.05: 系统负载,系统运行队列的平均利用率,可认为是可运行进程的平均数;
三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值;
单核CPU中load average的值=1时表示满负荷状态,多核CPU中满负载的load average值为1*CPU核数
第二行:任务进程信息
total: 系统全部进程的数量
running: 运行状态的进程数量
sleeping: 睡眠状态的进程数量
stoped: 停止状态的进程数量
zombie: 僵尸进程数量
第三行:CPU信息
us: 用户空间占用CPU百分比
sy: 内核空间占用CPU百分比
ni: 已调整优先级的用户进程的CPU百分比
id: 空闲CPU百分比,越低说明CPU使用率越高
wa: 等待IO完成的CPU百分比
hi: 处理硬件中断的占用CPU百分比
si: 处理软中断占用CPU百分比
st: 虚拟机占用CPU百分比
第四行:物理内存信息
以下内存单位均为MB
total: 物理内存总量
free: 空闲内存总量
used: 使用中内存总量
buff/cacge: 用于内核缓存的内存量
第五行:交互区内存信息
total: 交换区总量
free: 空闲交换区总量
used: 使用的交换区总量
avail Mem: 可用交换区总量
注:如果used不断在变化, 说明内核在不断进行内存和swap的数据交换,说明内存真的不够用了
问题:内存空间还剩多少空闲呢?
答案:空闲内存=空闲内存总量+缓冲内存量 +可用交换区总量
进程信息区(进程列表)
PID: 进程号
USER: 运行进程的用户
PR: 优先级
NI: nice值。负值表示高优先级,正值表示低优先级
VIRT: 占用虚拟内存,单位kb。VIRT=SWAP+RES
RES: 占用真实内存,单位kb
SHR: 共享内存大小,单位kb
S: 进程状态
%CPU: 占用CPU百分比
%MEM: 占用内存百分比
TIME+: 上次启动后至今的总运行时间
COMMAND: 命令名or命令行
进程状态
R=运行状态
S=睡眠状态
D=不可中断的睡眠状态
T=跟踪/停止
Z=僵尸进程
进程控制
后台运行和前后台调度
使用nohup命令让一个命令或程序脱离终端(即退出当前终端不会终止程序),使用&将命令置于后台运行,两者结合使用。
# 后台执行命令语法
nohup 命令 &
# 已经执行了的命令前台运行状态下,使用ctrl + z将其放置后台,但是该进程在后台是停止的状态。
# 查看后台进程运行状态使用jobs命令
jobs
# 指定任务在后台运行使用bg命令
bg 任务编号
# 将后台运行的命令变成前台运行使用fg命令
fg 任务编号
指定或者调整用户进程的nice值
nice值越高,该进程抢占资源的能力越弱
nice值越低,该进程抢占资源的能力越强
范围:-20~19
nice -- 运行时直接设置nice值
用法: nice -n 数字 command
renice -- 对于已经运行的,调整nice值
用法: renice 数字 PID
结束进程和进程信号
kill使用进程PID发送信号,pkill是使用程序名,如
kill -9 1188 # 强制终止该进程
kill -15 1188 # 优雅结束该进程
pkill -9 mysql # 强制结束mysql进程
kill -l # 列出kill信号列表
kill -l 信号列表
和终止进程相关的信号有:1 2 3 9 15 19 20
1) SIGHUP 终端的控制进程结束,通知session内的各个作业,脱离关系
2) SIGINT 程序终止信号(Ctrl+c)
3) SIGQUIT 和2号信号类似(Ctrl+\),产生core文件
4) SIGILL 执行了非法指令,可执行文件本身出现错误
5) SIGTRAP 有断点指令或其他trap指令产生,有debugger使用
6) SIGABRT 调用abort函数生成的信号
7) SIGBUS 非法地址(内存地址对齐出错)
8) SIGFPE 致命的算术错误(浮点数运算,溢出,及除数为0 错误)
9) SIGKILL 用来立即结束程序的运行(不能为阻塞,处理,忽略)
10) SIGUSR1 用户使用
11) SIGSEGV 访问内存错误
12) SIGUSR2 用户使用
13) SIGPIPE 管道破裂
14) SIGALRM 时钟定时信号
15) SIGTERM 程序结束信号(可被阻塞,处理)
16) SIGSTKFLT 协处理器栈堆错误
17) SIGCHLD 子进程结束,父进程收到这个信号并进行处理,(wait也可以)否则僵尸进程
18) SIGCONT 让一个停止的进程继续执行(不能被阻塞)
19) SIGSTOP 让一个进程停止执行(不能被阻塞,处理,忽略)
20) SIGTSTP 停止进程的运行(可以被处理和忽略)
21) SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.
22) SIGTTOU 类似SIGTTIN,但在写终端时收到
23) SIGURG 有紧急数据或者out—of—band 数据到达socket时产生
24) SIGXCPU 超过CPU资源限定,这个限定可改变
25) SIGXFSZ 当进程企图扩大文件以至于超过文件大小资源限制
26) SIGVTALRM 虚拟时钟信号(计算的是该进程占用的CPU时间)
27) SIGPROF 时钟信号(进程用的CPU时间及系统调用时间)
28) SIGWINCH 窗口大小改变时发出
29) SIGIO 文件描述符准备就绪,可以进行读写操作
30) SIGPWR power failure
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
信号的分类
不可靠信号:(1 - 31)
- Linux的信号处理继承自UNIX,早期的UNIX当信息处理函数执行完毕,该信号恢复成缺省处理动作(Linux已经改进)
- 信号不排队,会出现信号丢失现象
可靠信号:(34 - 64)
- 不会出现信号丢失
非实时信号:
- 不可靠信号都是非实时信号
实时信号:
- 可靠信号都是实时信号
trap -- 屏蔽进程信号
# shell脚本中使用 trap "" 信号 后可以屏蔽该信号,引号内可以写提示,直至遇到 trap - 信号 后解除
# 示例
#!/bin/bash
trap "无法中断!" 1 2 3 9 15 19 20
while [ -z $input_var ];do
read -p "请输入:" input_var
echo $input_var
done
trap - 1 2 3 9 15 19 20
read -p "..." stop
执行该脚本,trap屏蔽信号下的while循环无法被Ctrl C和Ctrl D终止脚本,直至到下一个trap解除。