从0开始学习Linux——进程管理

 往期目录:

从0开始学习Linux——简介&安装

从0开始学习Linux——搭建属于自己的Linux虚拟机

从0开始学习Linux——文本编辑器

从0开始学习Linux——Yum工具

从0开始学习Linux——远程连接工具

从0开始学习Linux——文件目录

从0开始学习Linux——网络配置

从0开始学习Linux——防火墙配置

从0开始学习Linux——系统服务管理

从0开始学习Linxu——系统常用命令

 这节教程我们来学习Linux系统中的进程管理。

一、进程

进程是操作系统为执行程序分配资源的基本单位。它是程序在系统中运行的一个实例。

每个进程都包含:

  • 程序代码:进程正在执行的指令。
  • 进程数据:进程运行时使用的变量、堆栈等数据。
  • 进程控制块(PCB):操作系统为进程分配的控制信息,包括进程ID、状态、优先级、寄存器、内存地址等。

 那么我们思考一下程序和进程它们之间有什么区别呢?

程序是静态的,它只是一段存储在磁盘中的代码,描述了一个待执行的任务,而进程是程序的动态执行实例。当程序被加载到内存并开始执行时,就成为了一个进程。

这里可能大家还是有一点蒙,这里我们就以QQ软件的运行来解释程序和进程的区别。

程序=QQ程序

我们通过官网下载好QQ以后就会在我们的电脑上创建对应的文件夹,它包含了所有需要的代码和资源,它只是一个静态的文件夹。

进程=正在运行的QQ

当我们使用鼠标去点击QQ程序的时候,QQ程序开始执行。操作系统会将它加载到内存中,并为它分配计算资源。此时,QQ开始运行,它变成了一个进程。你可以看到QQ在桌面上打开,能够发消息、接收消息、显示聊天界面等。这时,QQ进程会占用CPU、内存等计算机资源。

当然我们有时候会在电脑上同时去运行多个QQ以登录多个账号,那么运行了多少个QQ就是有多少个QQ进程,因此我们可以总结出一个程序中可以有多个进程。

现在我们已经知道了进程的基本概念,下面我们来了解一下进程的生命周期:

  •  新建 (New):进程被创建,但尚未开始执行。
  • 就绪 (Ready):进程已经准备好,可以等待 CPU 资源来执行。
  • 运行 (Running):进程当前正在使用 CPU 执行任务。
  • 阻塞 (Blocked):进程正在等待某些事件或资源(如I/O操作、锁等)。
  • 终止 (Terminated):进程执行完毕或被终止,等待系统清理。 

最后我们再来了解一下在Linux中关于进程的一些基本概念:

  • PID (Process ID):每个进程都有一个唯一的PID。
  • 父进程 (Parent Process):启动某个进程的进程称为父进程。
  • 子进程 (Child Process):由父进程创建的进程称为子进程。
  • 会话 (Session):多个进程可以组成一个会话,通常是由一个shell进程启动的。
  • 进程组 (Process Group):进程组是多个进程的集合,用于管理和控制一组进程。

关于进程的更多知识,大家可以自行学习操作系统相关知识。

二、查看进程

2.1 ps命令

ps(process status)命令用于显示当前运行的进程。

ps

 我们可以从上图中看出ps命令默认只显示当前终端会话的进程。如果我们想查看所有进程,可以使用-e或者-A参数。

ps -e
ps -A

如果我们想要查看更加详细的信息可以在ps命令上加上-f参数。

 上述命令可以查看所有进程的信息,如果我们只是想查看某个特定的进程信息,我们可以使用-p参数。

ps -p 进程ID

 假设现在我们想要查看防火墙firewalld服务的进程的id或者相关信息,那么ps -p 进程ID这条命令就不行了,我们可以使用下述命令。

ps相关命令 | grep 进程名称

 这里我们再来讲解一个ps命令的参数aux,该参数可以显示出所有用户的进程信息。

ps aux

这里我们可以思考一下-e参数可以查看所有进程的详细信息,而aux可以查看所有用户的详细信息,那么它们之间的区别如何呢?

aux参数和-e参数的区别如下表所示:

参数输出内容详细程度
aux列出所有进程及详细信息,包括 PID、进程所有者、CPU/内存占用等。高度详细,适合分析系统状态和进程资源使用情况
-e列出所有进程的 PID,不显示其他详细信息。简单、精简,适合快速查看进程 ID

 2.2 top命令

top命令提供了一个实时更新(top命令会每隔几秒自动更新显示系统中资源使用最多的进程)的进程列表,可以显示 CPU、内存等资源的使用情况,启动top命令以后按q表示退出,按p表示排序cpu使用情况,按m表示排序内存使用情况。

top

 2.3 htop命令

htop命令是top命令的一个增强版。

CentOS 7 的默认软件仓库中没有包含htop,因此我们需要先安装htop包。

yum install htop

 执行上述命令以后我们可以发现安装不成功,这是因为我们要去先安装EPEL仓库。

yum install epel-release

安装好EPEL仓库以后我们就可以去安装htop包了。

yum install htop

 现在我们就可以使用htop命令了。

htop

 通过上述运行过程我们可以看出,htop相比于top命令加载的信息更加详细,它包含的信息如下所示:

  • CPU 使用情况:显示 CPU 使用的百分比。
  • 内存和交换空间(Swap):显示内存和交换空间的使用情况。
  • 进程列表:显示所有进程的详细信息,包括 PID(进程ID)、用户、内存和 CPU 使用等。
  • 系统负载:显示系统的负载(1分钟、5分钟和15分钟的平均负载)。

htop命令执行后会加载出来一个彩色的交互界面,该交互界面常见操作如下所示:

  • 上下箭头:选择进程。
  • F3:搜索进程。
  • F6:排序进程(例如按 CPU 或内存使用排序)。
  • F9:杀死进程。
  • F10:退出 htop。

2.4 pstree命令

ps命令是查看系统中进程树结构的一种方式,该命令执行后会以树形结构显示系统中所有正在运行的进程及其父子关系。

我们在使用pstree命令之前需要先安装pstree包。

注意:在安装pstree包之前先安装EPEL仓库,当然我们前面已经安装好了,如果没有安装就重新安装一遍。

yum install epel-release

我这里表示已经安装好了。

接下来我们就可以安装pstree包了。

yum install pstree

执行命令以后发现没有可用的软件包,因此我们就需要思考一下为啥会出现这样的问题。

 虽然我们刚才使用命令安装EPEL仓库,但有时,YUM 缓存可能会导致包信息不准确。我们可以清除 YUM 缓存并更新仓库,看看能否解决问题。

yum clean all
yum makecache

接着我们再来尝试一下安装pstree包。

yum install pstree

我们可以发现现在还是说找不到pstree软件包,那么我们就要考虑在Centos7中pstree的软件包名称可能不是petree,因此我们先去搜索一下pstree相关信息。

yum search pstree

根据执行结果我们可以看出,对于pstree命令,我们应该安装psmisc.x86_64包。

 安装好以后我们来执行一下pstree命令。

如果我们想要查看完整的命令行,我们可以在pstree命令后面加上-a参数。

当然我们也可以只是查看特定进程。

 我们在执行完ps命令以后可以发现,进程树过于庞大,因此我们可以通过-l参数去控制进程树的深度。

pstree -l 进程深度

 我们知道Linux是一个多用户操作系统,也就是说一个Linux可以多个用户同时去操作,因此我们也可以通过-u和-c参数来查看特定用户的进程,其中-u参数可以查看特定用户的进程树,-c可以实现在众多用户线程中高亮显示当前用户的线程。

pstree -u 用户名称
pstree -c

2.5 pgrep命令 

grep命令其实我们前面已经接触过了,前面我们将grep命令和ps、pstree等相关命令结合起来查询指定进程的详细信息,当然我们也可以直接使用pgrep命令进行查询。 

pgrep -参数 进程名称

三、管理进程

3.1 启动进程 

 进程通常由用户通过命令行启动,这个命令要根据具体的任务来定。

进程启动命令

如果我们希望进程运行在后台,那么可以使用如下命令。

进程启动命令 &

如果我们想要某个进程启动时以守护进程(Daemon)形式运行,可以参考如下两种方式。

方式一:使用system管理守护进程

CentOS 7 默认使用systemd作为初始化系统,所有的系统服务都是通过systemd来管理的。因此,最推荐的方式是创建一个自定义的systemd服务单元。

步骤1:

创建一个新的systemd服务单元,也就是使用文本编辑器去创建一个service文件,例如/etc/systemd/system/demo1.service。当然这个文件名字需要根据任务来定,这里作为演示就取名为demo1

vim /etc/systemd/system/demo1.service

接下来我们就可以来配置demo1这个服务单元。

[Unit]
Description=My Daemon Application
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/myapp
Restart=always
User=nobody
Group=nogroup
Environment=MYAPP_ENV_VAR=value[Install]
WantedBy=multi-user.target

 这里只是随意举个例子。

步骤2:

配置好demo1服务单元以后,我们需要重新加载systemd配置,然后启动demo1服务。

systemclt daemon-reload
systemctl start demo1.service
systemctl enable demo1.service

启动好demo1服务以后可以通过命令去检查服务的运行状态。

systemctl status demo1.service

方式二:使用nohup命令

nohup 进程启动命令 &>日志输出路径 &

上述命令各个参数含义如下所示:

  • nohup:使进程忽略挂起信号(SIGHUP),即使用户注销,进程仍然继续运行。
  • &:将进程放到后台。
  • &>日志输出路径:将标准输出和标准错误输出重定向到指定路径,以避免输出到终端。

例如:

nohup /usr/bin/myapp &>/dev/null &

方式三:使用disown命令

在将进程放到后台后,我们可以使用disown命令来让该进程与当前终端会话分离,从而继续在后台运行,也就是在后台启动进程并解除它与终端的绑定,该方式适合用于不依赖systemd的简单场景。

步骤1:启动进程

进程启动命令 &

步骤2:使用disown命令将进程从当前会话中进行分离

disown

3.2 终止进程

如果我们想要终止一个进程可以使用kill命令。

kill命令基本用法如下所示:

  • kill 进程id:根据进程id杀死进程。
  • kill -9 进程id:根据进程id强制终止进程,也就是当我们使用”kill 进程id“命令不能杀死进程的时候就可以使用该命令强制杀死进程。
  • kill 进程名称:根据进程名杀死进程。
  • killall 进程名称:杀死所有跟进程名同名的进程。
kill 进程id
kill -9 进程id
kill 进程名称
killall 进程名称

3.3 后台进程管理

【查看后台进程】

我们可以使用jobs命令查看当前 shell 会话中的后台任务。

jobs

【后台进程转为前台进程】

fg <jobnumber>

[前台进程转为后台进程]

bg <jobnumber>

 3.4 进程优先级

3.4.1 nice命令

nice命令用于启动一个进程时设置其优先级。数字越小,优先级越高(负数代表提高优先级)。

nice -n 进程级别数值 进程启动命令

3.4.2 renice命令

renice命令用于改变一个已经运行的进程的优先级。

renice -n 进程级别数值 -p <PID>

3.5 进程状态

进程的状态通常由字母表示,这些字母代表进程的不同状态:

  • R (Running or Runnable):运行中或可运行的状态。表示进程正在 CPU 上执行,或者它正在等待 CPU 时间片以便运行。
  • S (Sleeping):睡眠状态。表示进程当前处于休眠状态,正在等待某些事件(例如,I/O 操作完成)。这通常是大部分进程的状态。
    • Interruptible Sleep:通常可以被信号中断。
    • Uninterruptible Sleep:进程正在等待某些系统资源(例如磁盘或网络),在此期间无法中断。
  • D (Uninterruptible Sleep):不可中断的睡眠状态,表示进程正在等待某些硬件操作(如磁盘I/O)完成,这时它不能被信号中断。
  • T (Stopped):已停止状态。进程已被暂停,通常是通过 SIGSTOPSIGTSTP 信号进行的暂停。也可能表示进程正在进行调试。
  • Z (Zombie):僵尸进程。进程已经终止,但是父进程尚未获取它的退出状态。此时进程占用系统进程表项,但不再执行任何代码。
  • X (Dead):已死状态,表示进程已经终止,但系统尚未清除它的相关信息。
  • W (Paging):进程在等待内存分页。通常在系统内存压力大的情况下出现。
  • < (High Priority):高优先级进程。表示进程具有较高的调度优先级,通常是内核线程或实时线程。
  • N (Low Priority):低优先级进程。表示进程的调度优先级低于正常进程。

3.6 进程调度

在 CentOS 7 中,进程调度由 CFS(Completely Fair Scheduler) 调度器负责,它会根据进程的优先级、等待时间和 CPU 使用情况决定哪个进程获得 CPU 时间。

  • 进程优先级:每个进程都有一个 nice 值,这个值越低,进程的优先级越高。默认的 nice 值是 0,负数表示更高的优先级。

  • 调度策略:Linux 使用多种调度策略来决定进程的执行顺序,最常见的包括:

    • CFS(Completely Fair Scheduler):公平调度器,根据进程的需要分配 CPU 时间。
    • 实时调度:如 FIFO(先进先出)和 Round Robin(轮询调度)。

我们可以通过chrt命令来查看或设置进程的调度策略和优先级。

chrt -p 进程ID

3.7 进程通信

  • 进程间通信(IPC,Inter-process Communication)是指多个进程之间的数据交换或信号传递。常见的进程间通信方法包括:
  • 管道 (Pipe)

    • 管道是单向的通信方式,允许一个进程将数据输出到另一个进程。
    • 使用 | 管道符号将多个命令链接起来。
  • 命名管道 (Named Pipe / FIFO)

    • 与普通管道不同,命名管道允许两个没有亲缘关系的进程进行通信。
  • 消息队列 (Message Queue)

    • 允许进程发送和接收消息,提供了比管道更复杂的通信方式。
  • 共享内存 (Shared Memory)

    • 通过共享内存,多个进程可以直接访问同一块内存区域进行数据交换。
  • 信号 (Signals)

    • 信号是操作系统用来通知进程发生了某种事件的机制。例如,SIGINT 用于中断进程,SIGKILL 用于强制结束进程。

本节教程就先到这里,更多将在后续教程中进行展示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12374.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

QT6.5+qt-quick+qml+cmake的Item布局学习

Item 是一个基础元素&#xff0c;它本身不会渲染任何东西&#xff0c;也不会提供一个窗口来显示其内容。Window 是一个可以显示内容的顶级元素&#xff0c;它通常会包含一个或多个子元素来构建用户界面。Item是全部QML可视化对象的根&#xff0c;所有可视化类型都由该类型派生出…

Cameralink转MIPI,Cameralink视频识别分析

CameraLink视频输入转MIPI极简方案&#xff0c;可直接输入到处理芯片中进行视频目标识别与跟踪

【算法】【优选算法】二分查找算法(下)

目录 一、852.⼭脉数组的峰顶索引1.1 二分查找1.2 暴力枚举 二、162.寻找峰值2.1 二分查找2.2 暴力枚举 三、153.寻找旋转排序数组中的最⼩值3.1 二分查找3.2 暴力枚举 四、LCR 173.点名4.1 二分查找4.2 哈希表4.3 暴力枚举4.4 位运算4.5 数学&#xff08;求和&#xff09; 一、…

递归函数学习 part1

一&#xff0c;初始递归&#xff1a;阶乘 1&#xff0c;原理 n的阶乘等于n乘以n-1的阶乘&#xff0c;而0的阶乘等于1. 2&#xff0c;代码展示 #include <iostream> using namespace std;int fact(int); int main() {cout<<fact(5);return 0; }int fact(int n) …

开源 - Ideal库 -获取特殊时间扩展方法(四)

书接上回&#xff0c;我们继续来分享一些关于特殊时间获取的常用扩展方法。 01、获取当前日期所在月的第一个指定星期几 该方法和前面介绍的获取当前日期所在周的第一天&#xff08;周一&#xff09;核心思想是一样的&#xff0c;只是把求周一改成求周几而已&#xff0c;当然其…

Python练习18

Python日常练习 题目&#xff1a; 请编fun函数&#xff0c;求44整型数组的主对角线元素的和。 说明&#xff1a; 如下图所示为一个44整型数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 测试用例&#xff1a; 1 2 3 4 5 6 7 8…

智防未戴帽,安全无死角

在追求高效与安全并重的现代工业环境中&#xff0c;员工佩戴安全帽作为最基本的防护措施&#xff0c;其重要性不言而喻。为了有效杜绝员工未佩戴安全帽的现象&#xff0c;我们提出了一套以AI视频分析与安全教育培训系统为核心的综合解决方案&#xff0c;旨在通过智能化手段与系…

C++ 优先算法 —— 四数之和(双指针)

目录 题目&#xff1a;四数之和 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 双指针算法 不漏的处理&#xff1a; 去重处理&#xff1a; 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 双指针算法 题目&#xff1a;四数之和 1. 题目解析 题目截图&#xff1a; 这道题与三数之和&am…

[vulnhub] Corrosion: 2

https://www.vulnhub.com/entry/corrosion-2,745/ 提示&#xff1a;枚举才是神 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是6 &#xff0c;kali是10 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) …

前端请求后端php接口跨域 cors问题

只需要后端在网站的入口文件 一般都是 index.php 加上 这几行代码就可以了 具体的参数可以根据需要去修改 header("Access-Control-Allow-Origin: *"); header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS); header(Access-Control-Allow-Heade…

【星闪EBM-H63开发板】AT固件的配置与测试

引言 前面的博客已经介绍了【星闪EBM-H63开发板】小熊派固件中心的使用_bearpi-bm h63固件烧录工具-CSDN博客和【星闪EBM-H63开发板】固件的烧录-CSDN博客&#xff0c;今天来测试一下另一种固件&#xff0c;也就是AT固件。有关AT固件的介绍参见&#xff1a;【星闪EBM-H63开发板…

Linux基础(十四)——BASH

BASH 1.BASH定义2.shell的种类3.bash的功能3.1 命令记录功能3.2 命令补全功能3.3 命令别名设置3.4 工作控制、 前景背景控制3.5 程序化脚本&#xff1a; &#xff08; shell scripts&#xff09;3.6 万用字符 4.bash的内置命令5.shell的变量功能5.1 变量的取用5.2 新建变量5.3 …

【前端学习笔记】JavaScript学习一【变量与数据类型】

一、变量 变量是计算机中用来存储数据的“容器”&#xff0c;通俗的理解变量就是使用【某个符号】来代表【某个具体的数值】&#xff08;数据&#xff09; 声明&#xff1a;声明(定义)变量有两部分构成&#xff1a;关键字 变量名 JavaScript 使用关键字 let 和 var 来声明&am…

使用Git工具在GitHub的仓库中上传文件夹(超详细)

如何使用Git工具在GitHub的仓库中上传文件夹&#xff1f; 如果觉得博主写的还可以&#xff0c;点赞收藏关注噢~ 第一步&#xff1a;拥有一个本地的仓库 可以fork别人的仓库或者自己新创建 fork别人的仓库 或者自己创建一个仓库 按照要求填写完成后&#xff0c;点击按钮创建…

Linux kernel 堆溢出利用方法(二)

前言 本文我们通过我们的老朋友heap_bof来讲解Linux kernel中off-by-null的利用手法。在通过讲解另一道相对来说比较困难的kernel off-by-null docker escape来深入了解这种漏洞的利用手法。&#xff08;没了解过docker逃逸的朋友也可以看懂&#xff0c;毕竟有了root权限后&a…

福昕阅读器高级版解决文件上传IEEE PDF eXpress字体未嵌入

文件上传IEEE PDF eXpress字体未嵌入问题 Errors: Font Arial-BoldMT, Arial-ItalicMT, ArialMT is not embedded (93x on pages 2-3,5) 因为没安装adobe&#xff0c;尝试使用福昕阅读器高级版解决&#xff08;学校统一买的&#xff0c;不知道普通版行不行&#xff09; 找到潜…

人工智能在智能家居的应用

AI 在智能家居场景中&#xff0c;一方面将进一步推动家居生活产品的智能化&#xff0c;包 括照明系统、音箱系统、能源管理系统、安防系统等&#xff0c;实现家居产品从感知到认知再到决策的 发展&#xff1b;另一方面在于智能家居系统的建立&#xff0c;搭载人工智能的多款产品…

如何管理好自己的LabVIEW项目

在LabVIEW项目开发中&#xff0c;项目管理对于提高开发效率、确保项目质量、减少错误和维护成本至关重要。以下从项目规划、代码管理、测试与调试、版本控制、团队协作等方面&#xff0c;分享LabVIEW项目管理的体会。 ​ 1. 项目规划与需求分析 关键步骤&#xff1a; 需求分析…

51c自动驾驶~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/11638131 #端到端任务 说起端到端&#xff0c;每个从业者可能都觉得会是下一代自动驾驶量产方案绕不开的点&#xff01;特斯拉率先吹响了方案更新的号角&#xff0c;无论是完全端到端&#xff0c;还是专注于planner的模型&a…

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器&#xff0c;将OpenCV中lib库里的o…