What is Process
在Linux中触发任意事件时, 系统将它定义一个进程并给予这个进程一个ID,称为PID, 同时根据触发该进程的用户与相关属性给予该PID一组有效的权限设置.
[触发事件]
process & program
程序: 二进制文件.
进程: 加载到内存中的程序. 程序被触发后, 系统会将执行该程序的用户的权限UID/GID, 程序的脚本和数据, 生成的PID加载到内存中, 该进程衍生的其它进程也会使用该进程的权限.
[ 子进程与父进程的概念 ]
由父进程触发程序产生的进程称为该进程的子进程, 两者关系通过PPID确定.
父进程fork and exec产生子进程: 父进程fork复制自身产生一个与父进程相同的临时进程, 父子的PID不同而且子具有PPID, 子进程exec加载实际要执行的程序.
job control
在一个bash内完成多个任务的管理功能.
what is job control
任务管理的限制:
- 进程必须为bash的子进程
- 前台: 可控制与执行命令的环境称为前台的任务(foreground)
- 后台: 可以自动执行的任务, 无法使用ctrl+c管理, 使用bg,fg进行管理.
- 后台不能接收前台的输入.
manage job control
任务存在状态. 分为暂停(stop)和运行(running)
job控制相关的命令:
[ & ]
该命令将任务直接丢到后台
示例:
tar -zcvf /tmp/www.tar.gz /root/workspace/root/www 1>/dev/null 2>&1 &
该命令不能被ctrl+c中断, 任务号码(job number)从1开始
[ ctrl + z ]
将任务丢到后台暂停
示例:
vim /tmp/test_1
输入ctrl+z将任务丢到后台暂停
[ jobs ]
查看目前的后台任务状态
语法:
jobs [-lrs]
# -l : 同时列出job的PID
# -r : 列出run的任务
# -s : 列出stop的任务
示例:
[1]表示job number, +表示最近被放到后台的任务, -为最近第二个放到后台的任务, Stopped表示停止状态
[ fg ]
将后台任务拿到前台处理
语法:
fg %jobnumber
# %jobnumber 表示job number, %可省略
示例: fg %1
[ bg ]
将任务在后台状态变成运行, 语法与fg相似
[ kill ]
管理后台的任务
语法:
kill -signal %jobnumber
# 向job number为%jobnumber发送信号
kill -l
# 显示所有的信号量
# -1 reload
# -2 ctrl+c
# -9 强制删除
# -15 正常方式终止进程
脱机管理:
[nohup]
语法:
nohup [命令参数] #终端前台运行
nohup [命令参数] & #终端后台运行
process management
search process
[ ps ]
查看某个时间点的进程记录下来
示例:
ps aux # 查看系统所有进程
ps -lA # 查看系统所有进程
ps axjf # 连同进程数一起查看

ps -l 仅查看自己的进程
- F 进程标识, 4代表该进程的权限为root, 1代表此子进程仅执行复制(fork)而没有执行(exec)
- S 进程状态, 主要有
- R : 运行
- S : 该进程处于睡眠, 但可以被唤醒
- D : 不可被唤醒的睡眠状态, 进程可能在等待IO的情况
- T : 停止状态, 可能在任务控制或跟踪状态.
- Z : 僵尸状态, 进程已经终止但无法被删除至内存外
- UID/PPID/PID
- C : CPU使用率
- PRI/NI : Priority/Nice, 进程的优先级
- ADDR/SZ/WCHAN : 内存相关, ADDR进程处于的内存地址, 运行时为-; SZ代表该进程使用的内存量; WCHAN表示目前进程是否运行, -表示正在运行.
- CMD 触发该进程的命令
ps aux查看所有进程, 字段表示的意义
- USER : 进程所属用户账号
- PID
- %CPU
- %MEM : 进程占用的物理内存比
VSZ : 进程使用掉的虚拟内存量(KB)
虚拟内存使用硬盘存储来当做内存
RSS : 进程占用的固定内存量(KB)
- TTY : 终端号, 终端无关则显示?
- STAT : 进程状态
- START : 进程开始时间
- COMMAND : 进程执行的实际命令
[ 僵尸进程 ]
进程已执行完毕但父进程无法释放子进程的资源.
如何查看? ps 命令CMD后面接
解决方案? 找到僵尸进程的父进程进行解决
[ top ]
查看进程的动态变化.
语法:
top [-d数字] | top [-bnp]
# -d: 表示刷新秒数
# -b : 已批量执行top
# -n : 与-b搭配, 执行top命令的次数 top -b -n 2 > /tmp/top.txt
# -p : 指定PID进行查看
top中的按键命令:
- ? : help
- P : CPU排序显示
- M : Memory排序显示
- N : 以PID排序
- T : 该进程使用的CPU时间累加排序
- k : 给某个PID信号量
- r : PID重新设置nice值(已测试)
- q : 退出
结果分析:
top - 20:12:55 up 9 days, 16:39, 2 users, load average: 0.02, 0.02, 0.00
Tasks: 124 total, 2 running, 72 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 6.2 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 6715776 total, 2668796 free, 2799428 used, 1247552 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 3586972 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 51864 5268 3732 S 0.0 0.1 1:48.85 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kb
时间 用户人数 1 5 15分钟的负载 进程 CPU use 系统进程 wa(IOwait)
[ pstree ]
查看进程树
语法:
pstree [-A|U] [-up]
# -A 进程树以ASCII字符连接
# -U 进程树以unicode字符连接
# -p 同时列出进程的PID
# -u 列出进程所属账号名称
process management
通过向进程发送信号量来管理进程
信号量:
| 代号 | 名称 | 内容 |
|---|---|---|
| 1 | SIGHUP | 启动被终止的进程, 重新加载配置文件 |
| 2 | SIGINT | ctrl+c中断进程的运行 |
| 9 | SIGKILL | 强制中断进程运行, 可能会损害进程 |
| 15 | SIGTERM | 正常的方式结束进程 |
| 19 | SIGSTOP | ctrl+z暂停进程的运行 |
[ kill -signal PID]
kill -signal %jobnumber
向PID进程或job发送信号量
ctrl+c 无法中断后台进程 kill-15 -pid 可以中断进程及其相关的所有子进程
[ killall -signal 命令名称 ]
通过命令名管理进程
语法:
killall [-iIe] [command name]
# i : 互动
# -e : exact
# -I : 命令名称忽略大小写
进程的执行顺序
进程的执行顺序考虑进程的优先级和CPU调度.
[ Priority & Nice ]
进程队列运行时需要根据Priority进行优先级排序, 高优先级的进程先执行.Pri值越低则优先级越高.
调整Priority? Priority是根据内核调整的, 用户无法干涉. 只能通过调整Nice值间接影响Priority, Priority与Nice值的关系:
PRI(new) = PRI(old) + nice
nice值调整注意:
- nice值可调整的范围为-20-19
- root可任意调整nice值
- 一般用户仅可调整自己进程nice值, 范围为0-19
- 一般用户仅可将nice调高
- 通过nice命令设置进程nice值, renice调整已经存在的进程nice值
[ nice ]
设置命令的nice值
语法:
nice [-n 数字] command
示例:
nice -n -5 vim &
ps -l
kill -9 %1
[ renice ]
重新条件进程的nice值
语法:
renice [number] PID
注意, 该进程的子进程会继承nice值.
查看系统资源信息
[ free ]
查看内存使用情况
语法:
free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
- -b | -m | -k | -g | -h 指定内存单位
- -t : total 显示物理内存与swap的总和
- -s N : 隔N秒刷新一次
- -c N : 一共显示N次
注意buffer与cache的区别, buffer是加快硬盘与内存的数据交换速度的手段; cache是加快cpu与内存的数据交换的技术.
[ uname ]
查看系统与内核相关信息
语法:
uname [-asrmpi] # 建议直接uname -a 显示全部内核信息
[ uptime ]
查看系统启动时间与任务负载
[ netstat ]
追踪网络或socket文件
语法:
netstat -[atunlp]
# a 显示所有网络和socket信息
# -t 显示tcp连接信息
# -u 显示udp连接信息
# -b 端口显示, 非进程
# -l 列出listen的服务
# -p 列出PID
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 kuaicdn:ssh 192.168.2.27:62715 ESTABLISHED
tcp 0 0 kuaicdn:ssh 192.168.2.27:63859 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 17954 /var/run/chrony/chronyd.sock
unix 3 [ ] DGRAM 9920 /run/systemd/notify
unix 2 [ ] DGRAM 9922 /run/systemd/cgroups-agent
unix 6 [ ] DGRAM 9937 /run/systemd/journal/socket
unix 13 [ ] DGRAM 9939 /dev/log
unix 2 [ ] DGRAM 15319 /run/systemd/shutdownd
unix 2 [ ] DGRAM 89553 @00028
unix 3 [ ] STREAM CONNECTED 20310
unix 3 [ ] STREAM CONNECTED 20309
unix 3 [ ] STREAM CONNECTED 20312
分为网络与系统进程相关部分:
Active Internet connections
- Proto : 协议
- Recv-Q : 非用户进程连接到该socket的复制的总Byte数
- Send-Q : 非远程主机传送过来的acknowledged总Byte数
- Local Address : 本地端的IP:port信息
- Foreign Address : 远程主机的IP:port信息
- State : 连接状态, 主要有建立(ESTABLISHED)和监听(LISTEN)
Active UNIX domain sockets: (socket负责进程相互通信)
- Proto : unix
- RefCnt : 连接到该socket的进程数量
- Flags : 连接标识
- Type : socket存取的类型, 有确认连接的STREAM与不需要确认的DGRAM(两种)
- State : CONNECTED标识多个进程之间已经建立连接
- Path : 连接到该socket的相关进程的路径
[ dmesg ]
分析内核产生的信息.
使用dmesg | more使界面暂停查看内核信息
[ vmstat ]
检测系统资源的变化, 包括CPU/内存/磁盘/IO状态等
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1398836 288 389348 0 0 4 34 0 82 0 0 100 0 0
进程字段的项目分别为:
- r : 等待运行中的进程数量
- b : 不可被唤醒的进程数量
内存字段项目分别为:
- swap : 虚拟内存被使用的容量
- free : 未被使用的内存容量
- buff : 用于缓冲存储器
- cache : 用于高速缓存
内存交换分区的项目为:
- si : 磁盘中取出进程的容量
- so : 内存不足将进程写入到磁盘的swap的容量
io:
- bi : 由磁盘读入的区块数量
- bo : 写入到磁盘中的区块数量
system:
- in : 每秒被中断的进程次数
- cs : 每秒执行的事件切换次数
cpu:
- us : 非内核层的CPU使用状态
- sy : 内核层使用的CPU使用状态
- id : 闲置
- wa : 等待io所耗费的CPU状态
- st : 被虚拟机使用的CPU状态
