Linux进程管理
内核的功用: 进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能
Process: 运行中的程序的一个副本
存在生命周期
Linux内核存储进程信息的固定格式: task struct
多个任务的task struct组成的链表: task list
进程创建:
内核创建init进程
init创建后续进程,存在父子关系
进程: 都由其父进程创建
fork()是用来创建进程的接口,存在于内核中;
当子进程需要修改数据时父进程会clone()一份空间给子进程来修改;
进程优先级:
0-139:
1-99: 实时优先级,数字越大优先级越高,很少需要手动处理
100-139: 静态优先级,用户可调度优先级
数字越小,优先级越高
Nice值:
-20,19: 分别对应于100-139;-20对应100,19对应139
进程类型:
守护进程: daemon,在系统引导过程中启动的进程,跟终端无关
前台进程: 跟终端相关,通过终端启动的进程
注意: 也可把前台启动的进程送往后台,以守护模式运行
进程状态:
运行态: running
就绪态: ready
睡眠态
可中断: interruptable
不可中断: uninterruptable
停止态: 暂停于内存中,但不会被调度,除非手动启动,stopped
僵死态: zombie,当此进程正在运行的话,父进程异常结束的话,此时进程就会变成僵死态
Linux进程查看以及管理的公祖:
pstree,ps,pidof,pgrep,top,htop,glance,pmap,vmstat,dstat,kill,pkill,job,bg,fg,nohup
pstree命令:
-p: 显示父进程下的子进程信息
ps命令:
Linux系统各进程的相关信息均保存在/proc/PID目录下的个文件中;
ps [OPTIONS]...
选项: 支持两种风格
常用选项组合: aux
u: 以用户为中心组织进程状态信息显示
a: 与终端相关的进程
x: 与终端无关的进程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 进程的属主
PID: 进程的PID号
%CPU: 进程占据CPU的百分比
%MEM: 进程占据内存的百分比
VSZ: 虚拟内存集
RSS: 常驻内存集,不能放在交换分区中的数据或指令
TTY: 运行的终端号
STAT: 进程状态
R: running
S: interruptable sleeping(可终端睡眠)
D: uninterruptable sleeping(不可终端睡眠)
T: stoped(停止态)
Z: zombie(僵死态)
+: 前台进程
l: 多线程进程
N: 低优先级进程
<: 高优先级进程
s: 会话创建者
START: 启动时间
TIME: 内存占据CPU的累积时长
COMMAND: 由哪个命令启动的此进程
常用选项组合: -ef
-e: 显示所有进程,包括与终端相关与终端无关选项
-f: 显示完整格式的进程信息
常用选项组合: -eFH
-F: 显示完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
pgrep,pkill:
pgrep [options] pattern
-u uid: 指明某一个有效用户的所有进程
-U uid: 指明某一个实际用户的所有进程
-t treminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的程序名
-p pid: 显示其父进程为此处指定的进程的进程列表
pkill [options] pattern
pidof:
根据进程名获取其PID
例:pidof sshd #获取sshd的父进程以及子进程PID号
top:
有许多内置命令可用:
排序:
P: 以占据的CPU百分比排序
M: 以内存占据百分比排序
T: 累积占据CPU时长
首部信息显示:
uptime信息: l命令,默认会显示的
tasks及cpu信息: t命令
cpu分别显示: 1
memory信息: m命令
s: 修改刷新时间间隔
q: 退出top
k: 终止制定进程
选项:
-d #: 指定刷新时间间隔,默认为3秒
htop(需要使用epel源安装):
htop:
-d #:指定刷新时间
-u username: 仅显示指定用户的进程
-s colomn: 以指定字段进行排序
交互式命令:
s: 跟踪选定进程的系统调用
l: 显示选定进程打开的文件列表
a: 将选定进程绑定至某指定CPU核心
t: 显示进程树
vmstat(虚拟内存状态)命令:
vmstat [options] [delay [count]]
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
procs: 与进程相关
r: 等待运行的进程的个数
b: 堵塞的进程个数
memory: 与内存相关
swapd: 虚拟内存的使用总量
free: 物理内存空闲总量
buff: 用于buffer的内存总量
cache: 用于cache的内存总量
swap: 与交换内存相关
si: 数据进入到swap的速率(kb/s)
so: 数据离开swap的速率(kb/s)
io: 与io相关
bi: 从块设备读入数据到系统的速率(kb/s)
bo: 保存数据至块设备的速率(kb/s)
system: 与系统相关
in: 中断速率
cs: 进程切换速率
cpu: 与cpu相关
us: 用户空间占据CPU比例
sy: 系统空间占据CPU比例
id: 空闲比例
wa: 等待I/O完成所消耗的时间比例
st: 被虚拟化偷走的时间比例
选项:
-s: 显示内存的统计数据
kill命令:
向进程发送控制信号,以实现对进程管理
显示当前系统可用信号:
# kill -l
常用信号:
1) SIGHUP: 无须关闭进程而让其重读配置文件
2) SIGINT: 终止正在运行的进程,相当于Ctrl+c
9) SIGKILL: 杀死正在运行的进程
15) SIGTERM: 终止正在运行的进程
18) SIGCONT
19) SIGSTOP
指定信号的方法:
(1) 信号的数字标识:1,2,9
(2) 信号的完整名称:SIGHUP
(3) 信号的简写名称:HUP
向进程发信号:
kill [-SIGNAL] PID...
终止特定名称标记的所有进程:
killall [-SIGNAL] Program(进程名)
例:
killall -15 httpd