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控制相关的命令:
[ & ]
该命令将任务直接丢到后台
示例:

  1. 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的任务

示例:
image.png

[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 # 连同进程数一起查看

image.png
ps -l 仅查看自己的进程
image.png

  • 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 ]
查看系统启动时间与任务负载
image.png

[ 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状态