Linux学习笔记05–进程管理
1.Linux进程概述
1.1概述
进程是计算机中程序基于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程由唯一**进程标识符(PID)**表示。
-
任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
-
创建进程由多种方式:
- 可以直接执行一个程序,以创建一个新进程
- 在程序内,通过fork和exec调用,创建新的进程
- 通过fork调用,父进程会复制自己的地址空间以创建一个新的子进程结构
通常,父进程在子进程运行期间处于睡眠(sleeping)状态,当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。
1.2进程和程序
程序: 二进制文件,静态 /bin/date, /usr/sbin/httpd,/usr/sbin/sshd, /usr/local/nginx/sbin/nginx
进程: 是程序运行的过程, 动态,有生命周期及运行状态。
1.3进程状态
- 进程在整个生命周期内状态会发生改变,主要有:
- 运行(running)态:进程占有处理器而正在运行
- 就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行
- 等待(wait)态:又称阻塞(blocked)态或者睡眠(sleeping)态,指进程不具备运行条件,且正在等待某个事件的完成。
1.4进程的分类
- 僵尸进程:一个进程使用fork调用创建子进程;如果子进程退出而父进程并没有调用wait或waitpid以获取子进程的状态信息,那么子进程的进程描述符就仍会保存在系统中,此时,子进程不再由父进程管理,因此就成为僵尸进程
- 交互进程:通常是由终端启动的进程。交互进程既可以在前台运行又可以在后台运行
- 批量处理进程,是一个进程序列,通常和终端没什么联系
- 守护进程:是一类在后台运行的特殊进程,用于执行特定的系统任务。通常在系统引导的时候启动,并且会一直运行到系统关闭。但也有一些守护进程只在有需要的时候才启动,完成任务后就会自动结束。
1.5进程优先级
指对CPU的优先使用级别。进程调度通过复杂的调度机制实现CPU效率最大化,调度算法包括实时调度算法、非实时调度算法等。从内核角度,优先级可分为动态优先级、静态优先级、归一化优先级等。
2.进程状态监测
2.1静态监测:查看当前进程状态的命令ps
命令功能:ps是process status的缩写,用于查看进程的状态信息
命令语法:ps [参数]
选项 | 参数含义 |
---|---|
a | 显示一个终端的所有进程,包括其他用户的进程 |
u | 显示进程的归属用户及内存的使用情况 |
x | 显示没有控制终端的进程 |
l | 长格式显示更加详细的信息 |
c | 列出进程时,显示每个进程真正的指令名称 |
f | 显示程序间的关系 |
j | 采用工作控制的格式显示进程状况 |
e | 列出进程时,显示每个进程所使用的环境变量 |
# 查看当前登陆产生了哪些进程
[john@lab]:~$ ps
[john@lab]:~$ ps -l
# 查看指定用户的进程信息
[john@lab]:~$ ps -u john
[john@lab]:~$ ps -u john -l
# 查看系统中的所有进程
[john@lab]:~$ ps aux
[john@lab]:~$ ps -aux
# 查看进程之间的关系
[john@lab]:~$ ps axjf
[john@lab]:~$ ps -axjf
# 列出所有进程及他们之间的关系
[john@lab]:~$ ps axjfc
# 比较 ps -ef 和 ps ef
> ps -ef中参数-e和a功能类似,可列出所有进程
> ps ef中的e指在列出进程的时候显示每个进程所使用的的环境变量,输出比ps -ef要少
# 查找指定进程的信息,以python为例
[john@lab]:~$ ps -ef | grep python
[john@lab]:~$ ps auxf | grep python
2.2动态监控:持续检测进程运行状态的命令top
命令功能:top命令能够实时持续显示系统中各个进程的资源占用情况,ps命令可以查看正在运行的进程,但属于静态监控,动态的还是得top来
命令语法:top [选项]
主要参数:
选项 | 参数含义 |
---|---|
-d | 秒数:指定top命令每隔几秒更新一次。默认是3秒 |
-b | 使用批处理模式输出,一般和-n选项合用,用于把top命令重定向到文件中 |
-n | 次数:指定top命令执行的次数,一般和-b选项合用 |
-p | 进程PID:仅查看指定ID的进程 |
-s | 使top命令在安全模式中运行,避免在交互模式中出现错误 |
-u | 用户名:只监听某个用户的进程 |
# 执行无参数的top命令
[john@lab]:~$ top
#>> 输入top命令后,如果不退出,则会持续运行,并动态更新进程的相关信息。在top命令的交互界面中按【Q】键或者【Ctrl+C】退出top命令,按【?】或【H】键得到top命令交互界面的帮助信息。
top - 18:09:00 UP 52 min, 2 users,load average:0.12, 0.03, 0.08
任务: 290 total.....
%Cpu(s):....#CPU状态
MiB Mem:...#内存状态
MiB Swap:...#Swap交换分区嘻嘻
进程 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND
280 root 1 20 1222 2164 648 S 0.3% 1.7% 0:08.47 systemd
USER: 运行进程的用户
PR: 进程优先级
NI: nice值,负值表示优先级高,正值表示优先级低
VIRT: 进程使用的虚拟内存总量,单位KB,VIRT=Swap+RES
RES: 进程使用的且未被换出的物理内存大小,单位KB,RES=CODE+DATA
SHR: 共享内存大小,单位KB
进程状态 D=不可中断的睡眠状态;R=运行;S=睡眠;T=跟踪/停止;Z=僵尸进程
%CPU: CPU占用率
%MEM: 物理内存占用率
TIME+ 进程使用的CPU时间总计,单位(1/100)s
COMMAND 进程名称(命令名/命令行)
# 使用top命令监控某个进程
[john@lab]:~$ ps aux|grep sshd
[john@lab]:~$ top -p 121
# 安装并运行进程httpd
[alice@tianyun ~]$ sudo yum -y install httpd
[alice@tianyun ~]$ sudo systemctl start httpd
# 使用top命令监控httpd进程
[root@localhost~]# ps auxf |grep httpd
[root@localhost~]# ps -ef
# 自定义显示字段
[root@localhost~]# ps axo user,pid,ppid,%mem,command
[root@localhost~]# ps axo user,pid,ppid,%mem,command |grep httpd
# 查看指定进程的PID
[yang@iZm5eiwihahzq6ds23gbf6Z ~]$ cat /run/sshd.pid
830
2.3查看进程数命令pstree
命令功能:pstree命令以树状图显示进程间的关系。通过进程树,我们可以知道进程的父进程和子进程。
命令语法:pstree [选项] [进程号|用户]
主要参数:
选项 | 参数含义 |
---|---|
-a | 显示命令行参数 |
-c | 不要对完全相同的子树进行压缩 |
-h | 高亮显示当前进程及其所有祖先 |
-H | 此参数的效果和指定参数-h类似,但会特别表明指定的程序 |
-I | 采用长列格式显示树状图 |
-n | 根据进程的PID号来排序,默认下是按程序名称 |
-p | 显示进程的PID号 |
-u | 显示进程对应的用户名 |
# 查看进程数
[john@lab]:~$ pstree
[john@lab]:~$ pstree -p #并打印每个进程的PID
# 显示进程的完整命令行参数
[john@lab]:~$ pstree -a #若有相同的进程名 会压缩显示
# 显示进程组ID
[john@lab]:~$ pstree -g
# 查看某个进程的树状结构
[john@lab]:~$ ps aux|grep sshd #查找sshd的PID并进入其树状结构
[john@lab]:~$ pstree -p 1267
# 查看某个用户启动的进程
[john@lab]:~$ pstree john
2.4列出文件打开文件信息的命令lsof
lsof 即:list opened files
用于列出当前进程打开的文件,需要root权限
# 查看与指定文件相关的进程
[john@lab]:~$ lsof /bin/bash
# 列出进程打开的所有文件
[john@lab]:~$ ps aux|grep sshd
[john@lab]:~$ sudo lsof -p 1267
# 列出所有的网路连接
[john@lab]:~$ lsof -i #权限不够
[john@lab]:~$ sudo lsof -i
#列出使用指定协议的网络连接
[john@lab]:~$ sudo lsof -i TCP
# 查看特定用户打开的特定类型文件
[john@lab]:~$ sudo lsof -a -u root -d txt #按照PID,从1号进程开始列出系统中所有进程正在调用的文件
[john@lab]:~$ sudo lsof -a -u root -d txt |more #分页显示
# 循环列出文件,直到被中断
[john@lab]:~$ sudo lsof -r 1 -u john -i -a #参数为1,表示每秒打印一次
3.进程状态控制
3.1 调整进程优先级的命令nice
命令功能:nice命令用户调整进程的niceness(友善度),低表示优先级高
命令语法:nice 命令[选项]
选项 | 参数含义 |
---|---|
-n,–adjustment=N | 将niceness设置为N(默认N=10) |
–help | 显示此帮助信息并退出 |
–version | 显示版本信息并退出 |
# 查看系统进程默认的niceness
[john@lab]:~$ nice
# 调整进程的优先级:使用默认值
[john@lab]:~$ nice vi&
[john@lab]:~$ ps -l
F S PID PPID C PRT NI ADDR SZ WCGAN TTY TIME CMD
0 T 133 132 0 8 0 - 18 do_sig pts/0 00:00:00 vi
#ATTENTION:
#由于vi会独占当前终端,无法查看执行效果,在其后加&,可将vi放入后台执行
通过ps -l指令可以查看进程的niceness值,值越大表示优先级越低,NI 是进程的优先级,PRI是进程当前的总优先级。并且PRI(new)=PRI(old)+NI
# 调整进程的优先级:使用指定的niceness
[john@lab]:~$ nice -n 15 vi& # niceness的值的范围是-20~19
'''
#【说明:】如果将指令niceness的值设置为负,必须要求管理员权限,说明该指令的优先级较高,强占资源
#如果将指令niceness的值设置为正,可直接设置,说明该指令的优先级较低
'''
[john@lab]:~$ sudo nice -n -15 vi&
[john@lab]:~$ sudo ps -l
'''
#--adjustment=N参数和-nN参数的效果是一样的,在等号右边设置对应的niceness值即可
'''
[john@lab]:~$ nice --adjustmesnt=15 vi&
[john@lab]:~$ ps -l
直接设置-n参数也可以设置niceness值,比如,nice -15 vi&
将vi的niceness值设置为15,
如果是nice --15 vi&
的话,则会将niceness的值设置为==-15==。
为避免混淆,建议使用–adjustment参数
3.2改变运行进程优先级的命令renice
命令功能:nice命令可以为即将运行的进程设置niceness值,而renice命令用于改变正在运行的进程的niceness值
renice:可重新设置niceness值
命令语法:
renice [-n] <优先级> [-p|--pid] <pid>...
renice [-n] <优先级> -g|pgrp <pgid>...
renice [-n] <优先级> -u|--user <用户>...
主要参数:
选项 | 参数含义 |
---|---|
-n | 指定nice增量 |
-p | 将参数解释为进程ID(默认) |
-g | 将参数解释为进程组ID |
-u | 将参数解释为用户名或用户组ID |
renice -8 -p 121 # 将PID为121的进程的niceness设置为-8
renice -8 -u yuyee # 将属于用户yuyee的进程的niceness设置为-8
renice -8 -g yg # 将属于用户组yg的进程的niceness设置为-8
# 查看进程的PID和niceness值
[john@lab]:~$ ps -l
# 调整进程的niceness值,需要root权限
[john@lab]:~$ sudo renice -8 -p 121
[john@lab]:~$ ps -l
3.3向进程发送信号的命令kill
命令功能:kill命令可以发送指定的信号到相应进程
命令语法:kill [-s 信号申明 | -n 信号编号 | -信号申明] 进程号 | 任务声明 ...
主要参数:
选项 | 参数含义 |
---|---|
-l | 列出全部信号名称 |
-s | 指定发送信号名称 |
-n | 指定发送信号编号 |
# kill -l 信号名 可以查找到对应的信号值
[john@lab]:~$ kill -l SIGHUP
[john@lab]:~$ kill -l SIGKILL
# ps 查找进程
[john@lab]:~$ ps -l
# 杀死进程
[john@lab]:~$ kill -KILL 121 #KILL是信号名称
[john@lab]:~$ kill 9 122 #9是信号编号
# 确认该进程已经被杀死
[john@lab]:~$ ps -l
# 查找进程
[john@lab]:~$ pidof vi
[john@lab]:~$ ps -l | grep vi
3.4通过名字杀死进程的killall
命令功能:Linux操作系统中的killall命令用于杀死指定名字的进程。
killall命令可以根据名字来杀死进程,它会给指定名字的所有进程发送信号。
命令语法:killall [选项] [进程号]
主要参数:
选项 | 参数含义 |
---|---|
-e | 要求精准匹配进程名称 |
-I(这是i的大写) | 进程名匹配不区分大小写 |
-g | 杀死进程组,注意不是进程 |
-i | 交互模式,杀死进程前先询问用户 |
-l(这是L的小写) | 列出所有的已知信号名称 |
-q | 不输出警告信号 |
-s | 发送指定的信号 |
-u | 终止指定用户的所有进程 |
#eg.
[john@lab]:~$ killall -9 vi
#终止指定用户的所有进程
[john@lab]:~$ killall -u yuyee
4.进程启动与作业控制
Linux操作系统将正在执行的一个或者多个相关进程成为一个作业(job)。
作业时用户向计算机提交的任务实体,而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。
4.1进程的启动
4.2进程的挂起
通过【Ctrl+Z】组合键挂起前台任务,需要时在运行
4.3使用jobs命令显示任务状态
命令功能:Linux下的jobs命令用于显示任务状态。
命令语法:jobs [选项] [任务声明 ...]
主要参数:
选项 | 参数含义 |
---|---|
-l (list开头的l) | 在正常信息的基础上列出进程号 |
-n | 仅列出上次通告之后改变了的状态的过程 |
-p | 仅列出进程号 |
-r | 限制仅输出运行中的任务 |
-s | 限制仅输出停止的任务 |
# 列出进程号
[john@lab]:~$ jobs -l
# 开启一个新的vi进程
[john@lab]:~$ vi #this is another vi job
# 【Ctrl+Z】将该vi键挂起
# 若遇到无法退出的情况
# --【ESC+:q!】(不保存文本)
# 【ESC+:wq!】(保存文本)
# 列出进程号
[john@lab]:~$ jobs -l
4.4使用fg命令将任务移至前台
命令功能:fg[%N]命令将指定的任务N移至前台。N是通过jobs命令查到的后台任务编号(not pid)
[john@lab]:~$ jobs -l #列出进程信息
[1]- 121
[2]+ 132
【说明】:“+”表示该进程是当前任务;“-”表示不是当前任务
[john@lab]:~$ fg # 默认将进程132(它是+,当前任务)恢复到前台执行
[john@lab]:~$ fg %1 #将进程121恢复到前台执行
4.5使用bg 命令将任务移至后台
命令功能:使用bg[%N]将选中的任务N移至后台执行
eg>>> bg 2
4.6使用nohup命令启动脱离终端运行的任务
命令功能:nohup命令可以忽略挂起信号运行的指令
命令语法:nohup命令 [参数]
一般情况下通过终端启动进程后,该进程和终端是相互关联的,若终端关闭,则该进程也会终止。
nohup可以使得命令不断开,继续运行,常和&搭配使用
[john@lab]:~$ ping.www.ubuntu.com
[john@lab]:~$ nohup ping.www.ubuntu.com
# 该指令执行后生成日志文件“nohup.out"
[john@lab]:~$ ls nohup.out #通过ls 命令证实nohup.out文件存在
[john@lab]:~$ jobs #通过jobs命令证实该后台进程的存在
# 查看最新的消息
[john@lab]:~$ tail nohup.out
# 为验证nohup的作用,关闭当前shell终端,隔一段时间后重新连接
[john@lab]:~$ tail nohup.out -f
# 再次连接后,jobs命令并不能看到该进程的信息,可以用ps命令找出该进程,然后通过kill结束该进程
[john@lab]:~$ jobs
[john@lab]:~$ ps -ef | grep ping
[john@lab]:~$ kill -9 121
[john@lab]:~$ ps -ef | grep ping
参考资料:Ubuntu Linux 操作系统案例教程【张平】
本文链接:https://blog.youkuaiyun.com/qq_46426207/article/details/121921543