IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux学习笔记05--进程管理 -> 正文阅读

[系统运维]Linux学习笔记05--进程管理

Linux学习笔记05–进程管理

1.Linux进程概述

1.1概述

进程是计算机中程序基于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程由唯一**进程标识符(PID)**表示。

  • 任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。

  • 创建进程由多种方式:
    1. 可以直接执行一个程序,以创建一个新进程
    2. 在程序内,通过fork和exec调用,创建新的进程
    3. 通过fork调用,父进程会复制自己的地址空间以创建一个新的子进程结构

通常,父进程在子进程运行期间处于睡眠(sleeping)状态,当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。

  • 简单来说,进程是已启动的可执行程序的运行实例,进程有以下组成部分:

    ? 已分配内存的地址空间;

    ? 安全属性,包括所有权凭据和特权;

    ? 程序代码的一个或多个执行线程;

    ? 进程状态

1.2进程和程序

程序: 二进制文件,静态 /bin/date, /usr/sbin/httpd,/usr/sbin/sshd, /usr/local/nginx/sbin/nginx

进程: 是程序运行的过程, 动态,有生命周期及运行状态。

1.3进程状态

  • 进程在整个生命周期内状态会发生改变,主要有:
  1. 运行(running)态:进程占有处理器而正在运行
  2. 就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行
  3. 等待(wait)态:又称阻塞(blocked)态或者睡眠(sleeping)态,指进程不具备运行条件,且正在等待某个事件的完成。

1.4进程的分类

  1. 僵尸进程:一个进程使用fork调用创建子进程;如果子进程退出而父进程并没有调用wait或waitpid以获取子进程的状态信息,那么子进程的进程描述符就仍会保存在系统中,此时,子进程不再由父进程管理,因此就成为僵尸进程
  2. 交互进程:通常是由终端启动的进程。交互进程既可以在前台运行又可以在后台运行
  3. 批量处理进程,是一个进程序列,通常和终端没什么联系
  4. 守护进程:是一类在后台运行的特殊进程,用于执行特定的系统任务。通常在系统引导的时候启动,并且会一直运行到系统关闭。但也有一些守护进程只在有需要的时候才启动,完成任务后就会自动结束。

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.csdn.net/qq_46426207/article/details/121921543

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:43:00  更:2021-12-15 18:43:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:54:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码