跳到主要内容

12、Linux 实战:进程

  • 进程

  • 进程概念

  • 任务管理

  • 进程管理

    • 查看进程
    • 管理进程
  • /proc目录

进程

进程概念

进程(process):程序被触发后,执行者的权限与属性、程序的代码和所需使用的数据都会被加载到一个内存单元中,且操作系统给予该内存单元一个标识符(PID)
 

PID:在Linux中发生的任何事务,系统都将其定义为进程;并给予该进程一个ID(PID),同时根据触发该进程的用户与相关属性关系,给予该PID一组有效的权限设置
 

进程 程序
形式 动态 静态
所在存储器 内存 外存
存在时间 一定生命周期 永久
关系 进程就是一个正在运行中的程序

子进程:由一个进程(父进程)衍生出来的其他进程

//在Bash shell下执行的各种命令,就属于Bash shell(父进程)的子进程

Bash shell下再创建一个子进程Bash shell与普通子进程不同:

1)父进程的自定义变量是无法在子进程内使用的

父进程的环境变量是子进程可以使用的

2)子进程完成后,子进程的所有变量(操作)都会注销

而不会传回到父进程中

如:从一个Bash shell中进入子进程的Bash shel
 

如:设置name变量并赋值在子程序调用
 

一般进程:子进程由父进程创建(子进程可再创建新的进程);父子进程是一个异步过程,父进程不能预测子进程的情况;所以子进程结束后,父进程会调用wait()或waitpid()取得子进程的终止状态,回收子进程的资源

孤儿进程:父进程结束后,其一个或多个子进程还在运行;子进程的资源由init进程(PID=1)管理和回收

僵尸进程:子进程结束后,其父进程没有调用wait()或waitpid()去获取子进程的终止状态,且没有回收子进程的资源;则该子进程各种信息仍保存在系统中

任务管理

任务管理(job control):作用在Bash环境下,当用户登录系统获取Bash
shell后操作管理在单一终端下同时执行的多个任务

1)任务管理中,每个任务都是当前Bash的子进程(彼此之间是有相关性的)

2)只能管理当前终端Bash,无法使用任务管理的方式去管理其他终端Bash

前台(foreground):可控制、执行命令和等待操作的环境

后台(background):可存放暂停和自动执行任务的环境

1)放入后台的任务在运行时,是不能与用户进行交互的

//后台任务可以屏蔽Ctrl和C的终止

&命令:将命令放入Bash后台执行
指令格式:命令 数据流重定向 &

1)若没有数据流重定向,执行命令时的报告会突然出现在Bash前台;

2)命令产生的报告在命令结束时,才会在文件中出现;

如:将/home备份为/tmp/home.tar.gz
 
//任务号与Bash环境有关

如:以上例为基础,加上数据流重定向
 

jobs命令:列出当前Bash后台所有的任务状况

指令格式:jobs 选项

选项 含义
-r 仅列出正在运行(run)的任务
-s 仅列出正在暂停(stop)的任务
-l 同时列出任务的PID

如:列出当前主机的Bash后台任务状况
 

//其中第一个代表的是最近一个放入Bash后台的任务(后续同理)

fg命令:将Bash后台中指定任务号的任务调入前台执行

指令格式:fg %任务号

1)“%”作为可选项(可有可无),易于区分和理解

2)若不带参数,默认执行带“+”号的任务

//“fg -”代表执行带“-”号的任务

bg命令:将Bash后台中指定任务号的任务状态变成运行中(run)

指令格式:bg %任务号

kill命令:管理Bash后台中指定任务号的任务

指令格式:kill 选项 %任务号

1)后默认跟PID(若管理Bash后台任务,则必须使用“%任务号”方式)

选项 含义
-1 重新读取参数配置文件(重启)
-2 中断任务
-9 强制结束任务
-15 正常退出任务

Bash后台与系统后台不同,任务管理仍受到终端的影响

//Bash后台任务在运行/等待的情况下系统就关闭了

所有Bash后台任务都会被中断,且下次启动也不会运行

nohup命令:保证命令运行完成,使命令不受终端和系统的影响

指令格式:nohup 命令

1)即使在运行中系统关闭了,在下次启动系统时该任务会自动运行

2)nohup不支持Bash的内置命令,命令必须是外部命令

3)nohup命令可以和&命令搭配实现Bash后台任务的百分百执行

无论是否nohup命令是否数据流重定向

输出都默认写入当前执行目录下的nohup.out文件中

若该文件不可写,则写入$HOME/nohup.out文件中

//两个文件都不可写,则该命令不可调用

进程管理

查看进程

ps命令:列出系统某一时刻的进程信息

指令格式:ps 选项

选项 含义
-e 列出系统上所有进程(包括隐藏进程) 与-A选项具有同样效果 默认仅列出当前终端的进程
-f 同时显示UID、PPID、C和STIME栏位 默认仅:PID、TTY、TIME和CMD栏位
-l 同时显示F、S、UID、PPID、C、 PRI、NI、ADDR、SZ和WCHAN栏位
u 同时显示USER、%CPU、%MEM、 VSZ、RSS、STAT和START栏位
-u 用户名/号 列出指定用户运行的程序
-H 以树状结构列出进程

如:列出当前终端的进程
 
//CMD后面若跟“ ”,则代表该进程为僵尸进程

列的名称 列的含义
F 进程标识(process flags) 4:代表该进程的权限为root 1:代表该进程仅复制(fork)而没执行
S 进程状态标识 R(Running):进程正在运行 S(Sleep):进程正在睡眠(idle),可唤醒(signal) D:不可被唤醒的睡眠 T(Stop):进程停止 Z(Zombie):僵尸进程
UID 该进程执行的用户id
PID 该进程id
PPID (parent process ID) 该进程的父级进程id
C Cpu的占用率(百分数形式显示)
PRI 进程被CPU执行的优先级动态值(Priority)
NI 进程被CPU执行的优先级静态值(Nice)
ADDR 代表进程在内存的那个部分 -:代表进程正在运行
SZ 进程占用多少内存
WCHAN 进程是否正在运行 -:代表进程正在运行
TTY 发起该进程的设备识别符号 若显示“?”,表明该进程并不是由终端设备发起
STAT 进程状态的详细标识 (由双字符标识)
STIME (START) 进程的启动时间
TIME 进程占用CPU的执行时间
CMD (COMMAND) 该进程的名称或者对应的路径 执行该进程对应的实际命令
USER 进程所属用户
%CPU 进程占用的CPU资源百分比
%MEM 进程占用的物理内存百分比
VSZ 进程占用的虚拟内存量(KB)
RSS 进程占用的固定内存量(KB)

(1)双字符标识进程状态中:第一个字符等同于S列,第二个字符分别有:

1)<:该进程运行在高优先级上

2)N:该进程运行在低优先级上

3)L:该进程有页面锁定在内存中

4)s:该进程是控制进程

5)l: 该进程是多线程

6)+: 该进程运行在前提

如:火狐浏览器运行前后进行的进程查找对比
 
//若查询正确且找到该进程,应该显示为两个进程才正确

pstree命令:以树状图方式显示系统进程和其关系

指令格式:pstree 选项

1)Linux下所有的进程都依附在systemd进程下

选项 含义
-h 标出正在执行的进程
-n 以进程PID排序(默认以进程名)
-p 显示进程PID
-u 显示进程的执行用户

如:列出当前主机进程的树状图,并显示其PID
 

top命令:动态显示系统所有资源使用情况

指令格式:top 选项

选项 含义
-d 指定top刷新时间 (默认5秒刷新一次显示内容)
-p 动态显示指定PID的进程

如:查看当前主机资源使用情况
 

1)第一行:当前系统时间、已运行时间、登录系统用户数、平均任务负载

2)第二行:当前系统进程总量、不同进程状态数量(R、S、T、Z)

3)第三行:CPU的整体负载

4)第四行:物理内存情况(总量、剩余量、使用量、作为内核缓存的内存量)

5)第五行:虚拟内存情况(总量、剩余量、使用量、提前加载的内存量)

6)第六行:系统各个进程的详细信息

列的名称 列的含义
PID 进程的id
USER 运行该进程对应的用户
PR 进程被CPU执行的优先级动态值
NI 进程被CPU执行的优先级静态值
VIRT 虚拟内存
RES 常驻内存
SHR 共享内存
S (status) 进程的状态 S(sleepin):表示睡眠 R(run):表示运行
%CPU 该进程占用CPU的百分比
%MEM 该进程占用内存的百分比
TIME+ 进程执行的时间
COMMAND 进程的名称或者路径

//一个进程为运行向主机申请了500MB内存,而实际使用了320MB

则此时该进程的虚拟内存为500MB,常驻内存为320MB

且常驻内存中包含对其他进程的调用的使用

//进程实际使用的内存=常驻内存(RES)-共享内存(SHR)

在运行top命令时,按下以下快捷键可切换显示方式:

快捷键 含义
q 退出top显示
N 将结果按照PID进行奖降序排序
M 将结果按照内存从高到低进行降序排列
P 将结果按照CPU使用率从高到低进行降序排列
1 (数字一) 当系统拥有多个CPU的时候 可显示各个CPU的详细信息
k 给予某个PID一个信号(signal)
r 给予某个PID重新分配一个nice值

fuser命令:列出使用指定文档/文件系统的进程

指令格式:fuser 选项 文档/文件系统

选项 含义
-u 同时列出该进程的拥有者
-v 同时列出该进程的用户、进程名
-k 杀死该进程
-i 在杀死进程前需用户确认

如:查看当前目录被那些进程使用
 

ACESS 含义
c 该进程的工作目录
e 为进程的可执行文件
f 被进程打开的文件
F 被进程打开并写入的文件
r 该目录作为进程的根目录
m 进程使用该文件进行内存映射

lsof命令:列出被进程打开的文件名称

指令格式1:lsof 选项

选项 含义
-u 仅列出属于该用户进程打开的文件
-U 仅列出UNIX-like系统的Socket文件类型
-a 仅当多个选项条件同时满足时才显示

//若同时添加-u和-U选项,但不添加-a选项会导致显示结果出错

如:仅列出root用户进程使用的Socket文件
 

指令格式2:lsof +d 目录路径
1)+d:列出指定目录下所有被进程使用的文件

如:列出当前系统所有被使用的设备
 

pidof命令:列出指定程序名的进程PID

指令格式:pidof 选项 程序名

选项 含义
-s 仅列出一个PID
-x 列出运行该进程的Shell进程PID

如:列出系统上vim进程的PID
 

管理进程

kill命令:以进程PID管理系统中的进程

指令格式1:kill 进程PID //结束指定PID的进程

指令格式2:kill 信号 进程PID //发送信号给指定进程

1)也可使用“%任务号”代替“进程PID”

2)“-名称”和信号是一样的效果

信号 名称 含义
-1 SIGHUP 重新读取参数配置文件(重启)
-2 SIGINT 中断进程
-9 SIGKILL 强制结束进程
-15 SIGTERM 正常退出进程
-19 SIGSTOP 暂停进程

killall命令:以进程名称管理系统中的进程

指令格式1:killall 选项 进程名

选项 含义
-e 对进程名称进行精确匹配
-l 忽略进程名称的大小写
-p 删除进程所属的进程组
-u 删除指定用户的进程
-r 以正则表达式表示进程名称
-i 以交互式删除进程(删除前需确认)

//killall相较于kill更加实用,知道进程的名称即可(不需查询进程的PID)

指令格式2:killall 选项 信号 进程名 //发送信号给指定进程

Priority(PRI):由系统内核动态调整的优先级(用户无法直接调整PRI)

//PRI值越低代表该进程越优先

Nice(NI):由用户调整数值影响PRI的优先级(NI值有正负)

1)若调整进程的优先级,只能通过调整NI值

2)NI值可调整的范围为:-20~19

3)root可调整自己和任何用户进程的NI值,且范围为:-20~19

4)普通用户仅能调整自己进程的NI值,且范围为:0~19(避免抢占系统资源)

//普通用户仅能调高NI值

PRI(实际)=PRI(默认)+NI

 

nice命令:指定即将运行进程的NI值

指令格式:nice 选项 命令

选项 含义
-n 指定NI值

如:在Bash后台运行Vim,且NI值为-5
 

//PRI值和NI值都有默认值,一般为80和0

renice命令:指定正在运行进程的NI值

指令格式:renice NI值 进程PID

1)并不是在原本NI值的基础上加减,而是替换原本的NI值

如:重置Bash终端的NI值为-5
 
//NI值是在父进程-->子进程之间传递的

/proc目录

/proc目录:位于内存中的伪文件系统,提供用户和程序访问进程的接口

1)系统上所有进程都以PID命名的目录存放在/proc目录下

//lsmod命令是cat /proc/modules命令的别名

lspci命令是cat /proc/pci命令的别名

/proc目录下重要文件存储的信息:

文件名 内容
/proc/version 内核版本和GCC版本
/proc/cmdline 加载内核时所执行的命令和参数
/proc/kmsg 存储内核的输出信息
/proc/locks 存储由内核锁定的文件的相关信息
/proc/modules 系统已加载的模块列表
/proc/interrupts 系统上IRQ分配状态
/proc/ioports 系统上各个设备所配置的I/O地址
/proc/devices 系统已加载的所有块设备和字符设备信息
/proc/partitions 块设备每个分区的主设备号、次设备号信息 (包括每个分区所含的块数目)
/proc/bus 系统总线设备
/proc/loadavg 系统平均负载
/proc/cpuinfo CPU详细信息
/proc/uptime 系统自上次启动后的运行时间
/proc/filesystems 系统支持的文件系统
/proc/mounts 系统已挂载的所有文件系统
/proc/mdstat 存储RAID相关磁盘的状态信息
/proc/meminfo 系统内存相关信息
/proc/kcore 物理内存的镜像大小 (等于已使用的物理内存大小再加上4k)
/proc/vmstat 系统虚拟内存信息
/proc/swaps 系统交换分区的状态信息
/proc/diskstats 磁盘I/O信息 (读写次数、读写字节数、读写延时)
/proc/net/dev 每块网卡的流入/流出信息 (接受包总数、发送包总数等信息)

进程目录下重要文档存储的信息:

文件名 内容
cmdline 存储启动该进程时的完整命令
exe 启动进程的可执行文件 (软链接)
maps 进程关联的执行文件和库文件
environ 存储该进程相关的环境变量 (变量名大写,值小写)
mem 该进程所占用的内存信息 (仅能被系统调用,用户不可读取)
statm 该进程占用的内存信息 (可被用户读取)
status (stat同理) 该进程的状态信息 (status可读性较强)
limits 存储该进程使用资源的限制信息
root 该进程运行时相对的根目录 (软连接)
cwd 进程所运行的目录 (软链接)
fd 存储该进程打开每个文件的文件描述符的目录 (软链接)
task 存储该进程下各个线程相关信息的目录

//一个文件正在被使用时被删除,该文件并不会立即被删除(磁盘也不会被释放)

只有当该进程关闭文件的文件句柄时,文件才会被真正删除

//可通过文件句柄恢复被删除的文件(对文件句柄进行拷贝)