当前位置: 首页 > news >正文

Linux程序与进程:核心概念与管理全解析

目录

一、Linux程序与进程:核心概念解析

1. 程序、进程与线程的定义与区别

(1)程序(Program)

(2)进程(Process)

(3)线程(Thread)

(4)三者的核心区别对比

2. 进程的生命周期与父子关系

(1)进程的创建:fork()系统调用

(2)系统第一个进程:init/systemd

(3)父子进程的交互与终止

二、Linux程序管理:从安装到运维

1. 课程目标与核心技能

2. 常见软件包类型与特性

3. 软件安装方法详解(附操作示例)

(1)RPM包安装(手动管理依赖)

(2)YUM/DNF安装(自动解决依赖,推荐)

(3)源码包安装(自定义编译,适合高级用户)

(4)二进制包安装(最简单,直接运行)

4. 软件包管理工具对比与选择建议

5. Systemd服务管理(管理后台程序的核心机制)

(1)核心概念

(2)运行级别与Target对应关系(传统vs现代)

(3)常用systemctl命令(服务管理)

(4)服务故障排查流程

(5)注意事项

三、 常用命令速查表


一、Linux程序与进程:核心概念解析

1. 程序、进程与线程的定义与区别

(1)程序(Program)
  • 本质​:一组静态的指令集合​(包括代码、数据及配置参数),以文件形式存储在磁盘(如ELF格式的可执行文件、RPM/DEB包封装的软件)。程序本身不具备运行能力,仅当被操作系统加载时才成为“活的实体”。

  • 关键特性​:

    • 静态性:不占用CPU/内存等运行时资源(除非被加载)。

    • 可复用性:同一程序可被多次执行,生成多个独立的进程实例。

    • 封装性:通常包含完整的逻辑功能(如文本编辑器vim、Web服务器nginx)。

(2)进程(Process)
  • 本质​:程序在操作系统中的动态执行实例,是系统分配资源(CPU时间片、内存空间、文件句柄等)的最小单位。每个进程拥有独立的地址空间和运行状态(如运行中、休眠、终止)。

  • 关键特性​:

    • 动态性:具有生命周期(从创建到终止),运行时占用系统资源。

    • 唯一标识:通过进程ID(PID)​父进程ID(PPID)​唯一标识(如PID=1234的进程由PPID=1的systemd进程创建)。

    • 并发性:多个进程可在同一时间段内交替执行(通过CPU时间片轮转实现“伪并行”)。

    • 资源隔离:每个进程的地址空间相互独立(默认情况下不共享内存,需通过IPC机制通信)。

(3)线程(Thread)
  • 本质​:进程内的最小执行单元,是操作系统调度和分派的基本单位。一个进程可包含多个线程(如浏览器同时处理页面渲染和网络请求),线程共享进程的资源(内存、文件描述符等),但拥有独立的执行栈和程序计数器。

  • 关键特性​:

    • 轻量级:创建/销毁开销远小于进程(无需独立地址空间)。

    • 共享性:线程间可直接访问进程的全局变量和堆内存(需同步机制避免竞争)。

    • 依赖性:线程必须依附于进程存在(不能独立运行)。

(4)三者的核心区别对比

维度

程序

进程

线程

形态

静态文件(磁盘存储)

动态实例(运行中的程序)

进程内的执行单元

资源占用

不占用运行时资源

占用CPU/内存/文件句柄等

共享进程资源(独立栈/计数器)

生命周期

永久(除非删除文件)

临时(从启动到终止)

临时(随进程或主动退出)

并发性

支持多进程并发

支持单进程内多线程并发

独立性

完全独立

独立(默认不共享内存)

依赖进程(共享资源)


2. 进程的生命周期与父子关系

(1)进程的创建:fork()系统调用
  • 机制​:所有进程(除第一个系统进程外)均由其父进程通过fork()系统调用复制生成。fork()会复制父进程的地址空间(内存数据/堆栈)、文件描述符、环境变量、安全上下文等,生成一个与父进程几乎完全相同的子进程(仅PID和PPID不同)。

  • 本质​:子进程是父进程的“克隆体”,初始状态与父进程一致,但后续可通过exec()系列函数加载新程序(如从bash fork出nginx进程后,exec加载nginx程序)。

(2)系统第一个进程:init/systemd
  • CentOS 6及之前​:第一个系统进程是init(PID=1),负责初始化系统环境并启动其他基础服务。

  • CentOS 7及之后​:第一个系统进程是systemd(PID=1),不仅承担init功能,还统一管理系统服务(如网络、日志、容器等),支持并行启动和依赖管理。

(3)父子进程的交互与终止
  • 运行逻辑​:父进程通常通过fork()创建子进程后进入休眠(等待子进程完成任务),子进程独立执行具体任务(如处理用户请求)。

  • 终止流程​:

    1. 1.

      子进程完成任务后调用exit()系统调用,向父进程发送终止信号。

    2. 2.

      子进程释放自身占用的大部分资源(如内存、文件句柄),但可能残留部分未完全清理的结构(如进程控制块PCB的部分信息),此时称为僵尸进程(Zombie)​

    3. 3.

      父进程通过wait()waitpid()系统调用接收子进程的终止信号,回收僵尸进程的残留资源,避免系统资源泄漏。

    4. 4.

      若父进程先于子进程终止(异常情况),子进程会被init/systemd进程接管(PPID变为1),并由其最终清理。

关键问题​:僵尸进程本身不占用CPU/内存,但会占用PID资源(若大量堆积可能导致系统无法创建新进程)。正常情况下,父进程会主动回收子进程;若出现僵尸进程,需检查父进程是否异常(如未正确实现wait逻辑)。


二、Linux程序管理:从安装到运维

1. 课程目标与核心技能

  • 掌握​:Linux系统下软件的安装方法(RPM/YUM/源码/二进制)、软件包管理命令(rpm/yum/dnf)、yum源配置(本地/网络)、systemd服务管理机制。

  • 应用​:根据场景选择合适的安装方式,解决依赖问题,配置服务开机自启及故障排查。


2. 常见软件包类型与特性

类型

后缀/格式

适用系统

特点

依赖管理

RPM包

.rpm(如nginx-1.20.rpm

RedHat/CentOS

预编译的二进制包,包含默认安装路径(如/usr/bin/nginx)、配置文件(如/etc/nginx/nginx.conf),但需手动解决依赖(如nginx依赖PCRE库)。

需通过yum/dnf或手动安装依赖包。

DEB包

.deb(如firefox.deb

Debian/Ubuntu

类似RPM,专为Debian系设计,默认路径和配置规则与RPM不同,依赖同样需手动处理。

依赖apt/dpkg解决。

二进制包

.bin(如jdk-8u14.bin

通用

直接可执行的安装脚本(本质是编译好的二进制文件+安装逻辑),双击或运行后自动解压到指定目录(如/opt/jdk)。

通常无复杂依赖(可能需基础库如glibc)。

源码包

.tar.gz/.tar.bz2(如nginx-1.20.tar.gz

通用

原始代码文件,需用户手动编译(通过gcc/make等工具)为二进制后安装,可自定义安装路径、功能模块(如禁用HTTP/2支持)。

需提前安装编译工具链(gcc/make)及依赖库(如openssl-devel)。


3. 软件安装方法详解(附操作示例)

(1)RPM包安装(手动管理依赖)
  • RPM包命名规则​:

    软件名-版本号-发布次数.系统版本.架构.rpm(如nginx-1.20.1-1.el7.x86_64.rpm

    • 版本号:主版本.次版本.修订号(如1.20.1)。

    • 系统版本:el7(CentOS 7)、el8(CentOS 8)。

    • 架构:x86_64(64位)、i686(32位)。

  • 核心命令​:

    # 查询已安装的RPM包
    rpm -q 软件名                 # 检查是否安装(如rpm -q nginx)
    rpm -qa | grep 关键词         # 列出所有已安装包中包含关键词的(如rpm -qa | grep python)
    rpm -qi 软件名                # 查详细信息(版本、作者、依赖等)
    rpm -ql 软件名                # 列出该软件安装的所有文件路径(如rpm -ql nginx)
    rpm -qf /path/to/file         # 查某个文件属于哪个包(如rpm -qf /usr/bin/nginx)
    rpm -qc 软件名                # 查配置文件路径(通常位于/etc/软件名/)
    rpm -qd 软件名                # 查帮助文档路径(通常位于/usr/share/doc/软件名/)# 安装/卸载RPM包
    rpm -ivh 包全名.rpm           # 安装(-i安装,-v显示过程,-h人性化进度条)
    rpm -Uvh 新包.rpm             # 升级旧包(保留配置文件)
    rpm -e 软件名                 # 卸载(如rpm -e nginx)
    rpm -ivh *.rpm                # 批量安装当前目录下所有rpm包# 特殊选项
    --nodeps                      # 忽略依赖强制安装(不推荐,可能导致软件无法运行)
    --force                       # 强制覆盖已安装的包(慎用)
  • 典型场景​:

    从CentOS镜像的Packages/目录找到所需rpm包(如zip-3.0-11.el7.x86_64.rpm),通过rpm -ivh zip-*.rpm安装。若报错“依赖缺失”(如需要libz.so.1),需先安装依赖包(通过yum provides libz.so.1查找提供该依赖的包,再安装)。

(2)YUM/DNF安装(自动解决依赖,推荐)
  • YUM源类型​:

    • 本地源​:使用本地光盘/镜像中的软件包(需包含repodata/目录,存储包的元数据)。

    • 网络源​:通过HTTP/HTTPS/FTP访问远程仓库(如阿里云、清华源)。

  • 配置本地YUM源(以CentOS光盘为例)​​:

    # 1. 挂载光盘到/mnt目录
    mount /dev/sr0 /mnt           # sr0通常是光驱设备(可通过lsblk查看)# 2. 备份原有源配置并创建本地源文件
    cd /etc/yum.repos.d/          # 所有yum源配置文件存放于此
    rm -rf *                      # 删除默认源(避免冲突)
    vim local.repo                # 创建新配置文件# 3. 写入本地源配置(关键参数)
    [local]                       # 源的唯一标识名(不可重复)
    name=Local CentOS Repository  # 描述信息
    baseurl=file:///mnt           # 本地软件包路径(指向挂载的光盘目录)
    enabled=1                     # 启用该源(1启用,0禁用)
    gpgcheck=0                    # 不验证签名(简化操作,生产环境建议1并配置gpgkey)# 4. 清理缓存并生成元数据
    yum clean all                 # 清理旧缓存
    yum makecache                 # 生成新缓存(加载repodata中的包信息)
  • 常用YUM命令​:

    # 基础操作
    yum install 软件名            # 安装(交互式询问,输入y确认)
    yum -y install 软件名         # 自动确认安装(非交互,推荐新手)
    yum remove 软件名             # 卸载
    yum update 软件名             # 升级指定软件
    yum update                    # 升级所有已安装软件
    yum list                      # 列出仓库中所有可用软件
    yum list installed            # 列出已安装的软件
    yum search 关键词             # 搜索软件名或描述中包含关键词的包
    yum provides 文件名/功能      # 查哪个包提供某个文件或功能(如yum provides ifconfig)# 高级操作
    yum download 软件名           # 下载软件包但不安装(保存到缓存目录)
    yum groupinstall "组名"       # 安装一组相关软件(如“Development Tools”开发工具包)
    yum localinstall 本地包.rpm   # 安装本地rpm包(自动解决依赖)
  • 典型场景​:

    安装nginx:yum -y install nginx(自动从配置的源下载依赖包并安装);

    搜索软件:yum search web server(查找与web服务器相关的包);

    解决依赖问题:若报错“缺少依赖”,优先通过yum安装(比手动查找更可靠)。

(3)源码包安装(自定义编译,适合高级用户)
  • 适用场景​:需要修改软件配置(如安装路径、禁用特定模块)、使用最新版本(官方源可能滞后)、优化编译参数(如针对特定CPU架构)。

  • 核心步骤​(以nginx为例):

    # 1. 下载并解压源码包
    wget https://nginx.org/download/nginx-1.20.1.tar.gz
    tar -xf nginx-1.20.1.tar.gz
    cd nginx-1.20.1# 2. 配置编译选项(关键!指定安装路径和其他参数)
    ./configure --prefix=/usr/local/nginx1.20 \  # 设置安装根目录(所有文件将放在此目录下)--with-http_ssl_module \         # 启用SSL模块(支持HTTPS)--with-pcre=/usr/local/pcre      # 指定PCRE库路径(若依赖库不在默认位置)# 3. 编译与安装
    make                                      # 编译(将源码转为二进制,生成Makefile)
    make install                              # 安装到--prefix指定的目录# 4. 验证与快捷访问(可选)
    /usr/local/nginx1.20/sbin/nginx -v        # 查看nginx版本
    ln -s /usr/local/nginx1.20/sbin/nginx /usr/local/sbin/  # 创建软链接,全局可用nginx命令
  • 关键命令解析(configure)​​:

    ./configure是源码包的配置脚本,通过--prefix等参数控制安装行为。常用参数:

    • --prefix=PATH:指定安装根目录(默认通常是/usr/local/)。

    • --with-模块名:启用某个功能模块(如--with-http_ssl_module)。

    • --without-模块名:禁用某个功能模块(如--without-http_gzip_module)。

  • 依赖问题​:若报错“缺少xxx库”,需通过yum安装开发包(如报错“缺少zlib”,则执行yum install -y zlib-devel)。

(4)二进制包安装(最简单,直接运行)
  • 适用场景​:绿色软件(如JDK、Python解释器),下载后无需编译,直接解压或运行安装脚本。

  • 典型示例(JDK二进制包)​​:

    # 1. 下载JDK二进制包(如jdk-8u14-linux-x64.bin)
    chmod +x jdk-8u14-linux-x64.bin          # 添加执行权限
    ./jdk-8u14-linux-x64.bin                 # 运行安装脚本(按提示解压到当前目录)
    mv jdk1.8.0_14 /usr/local/jdk            # 移动到标准目录(可选)
    export PATH=/usr/local/jdk/bin:$PATH     # 临时配置环境变量(需写入~/.bashrc永久生效)

4. 软件包管理工具对比与选择建议

工具

适用场景

优势

劣势

RPM

离线环境/手动安装单个包

精确控制单个包的安装/卸载

依赖需手动解决,易出错

YUM/DNF

在线环境/批量安装(推荐)

自动解决依赖,支持仓库管理

依赖网络,配置源需技巧

源码

定制需求/最新版本

可修改配置,优化编译参数

过程复杂,依赖开发环境

二进制

绿色软件/快速部署

无需编译,直接运行

功能可能受限,无标准化路径

新手建议​:优先使用yum -y install(自动解决依赖),其次尝试二进制包;仅在需要定制时使用源码安装。


5. Systemd服务管理(管理后台程序的核心机制)

Systemd是现代Linux(CentOS 7+)的初始化系统和服务管理器,替代传统的SysVinit,统一管理所有系统服务(如nginx、mysql、sshd)。

(1)核心概念
  • Unit(单元)​​:systemd管理的最小对象(如服务、挂载点、定时器),配置文件存放在:

    • /usr/lib/systemd/system/:系统默认安装的unit文件(不建议直接修改)。

    • /etc/systemd/system/:用户自定义的unit文件(优先级高于默认配置)。

  • 常见Unit类型​:

    类型

    扩展名

    作用

    示例

    Service

    .service

    定义一个后台服务(如nginx)

    nginx.service

    Target

    .target

    定义一组unit的集合(类似运行级别)

    multi-user.target

    Socket

    .socket

    进程间通信的套接字(如数据库监听)

    mysql.socket

(2)运行级别与Target对应关系(传统vs现代)

传统运行级别

Systemd Target

说明

0

poweroff.target

关机

1

rescue.target

单用户模式(无密码,用于修复系统)

3

multi-user.target

字符界面多用户模式(无图形界面)

5

graphical.target

图形界面多用户模式(带桌面环境)

6

reboot.target

重启

  • 查看当前运行级别​:

    runlevel                  # 输出如"N 3"(N表示无上一次级别,当前为3)
    systemctl get-default     # 查默认target(如graphical.target)
  • 切换运行级别/Target​:

    init 3                    # 切换到字符界面(等价于systemctl isolate multi-user.target)
    systemctl set-default multi-user.target  # 设置默认启动到字符界面
(3)常用systemctl命令(服务管理)
# 服务控制(核心操作)
systemctl start 服务名.service      # 启动服务(如systemctl start nginx)
systemctl stop 服务名.service       # 停止服务
systemctl restart 服务名.service    # 重启服务(先停后启)
systemctl reload 服务名.service     # 重载配置(不重启,仅重新加载配置文件,如nginx.conf)
systemctl status 服务名.service     # 查服务状态(重点关注"Active: active (running)"表示运行中)# 开机自启管理
systemctl enable 服务名.service     # 设置开机自启动
systemctl disable 服务名.service    # 取消开机自启动
systemctl is-enabled 服务名.service # 查是否已设置开机自启(输出"enabled"或"disabled")# 辅助操作
systemctl daemon-reload           # 修改unit文件后必须执行(重新加载配置)
systemctl list-units -t service   # 列出所有正在运行的服务
journalctl -xe                    # 查看系统日志(定位服务报错原因)
(4)服务故障排查流程
  1. 1.

    查看状态​:systemctl status nginx.service→ 检查“Active:”行(running表示正常,failed表示失败)。

  2. 2.

    分析错误​:

    • 脚本错误​(如命令不存在):

      Failed to start nginx.service: Unit is not loaded properly: Invalid argument.
      Loaded: error (Reason: Invalid argument)

      可能原因:unit文件中的ExecStart路径错误(如指定的nginx二进制文件不存在)。

    • 配置文件错误​:

      Job for nginx.service failed because the control process exited with error code.
      See "systemctl status nginx.service" and "journalctl -xe" for details.
      AH00526: Syntax error on line 42 of /etc/nginx/nginx.conf:

      可能原因:nginx配置文件(如/etc/nginx/nginx.conf)第42行语法错误。

    • 依赖问题​:若服务依赖其他服务(如数据库),需先确保依赖服务已启动。

  3. 3.

    通用排查命令​:

    journalctl -xe                  # 查看详细系统日志(按时间排序,定位最近错误)
    systemctl daemon-reload         # 修改unit文件后必须执行
(5)注意事项
  • 编译安装的软件​(如通过源码安装的nginx)默认不被systemd管理,需手动创建unit文件(存放在/etc/systemd/system/nginx.service)并配置ExecStart=/usr/local/nginx/sbin/nginx

  • 修改unit文件后,必须执行systemctl daemon-reload使配置生效。


三、 常用命令速查表

场景

命令示例

查询RPM包

rpm -q nginxrpm -qa \| grep nginxrpm -ql nginx

安装RPM包

rpm -ivh nginx-1.20.rpmrpm -Uvh 新包.rpmrpm -e nginx

YUM安装

yum -y install nginxyum search nginxyum provides ifconfig

源码安装

./configure --prefix=/usr/local/nginxmakemake install

Systemd管理

systemctl start nginxsystemctl enable nginxsystemctl status nginx

日志排查

journalctl -xesystemctl status 服务名

http://www.dtcms.com/a/354081.html

相关文章:

  • Class45循环神经网络RNN
  • “互联网 +”时代下开源 AI 大模型 AI 智能名片 S2B2C 商城小程序:行业变革与未来展望
  • 基于 Ultralytics YOLO11与 TrackZone 的驱动的高效区域目标跟踪方案实践
  • Python Imaging Library (PIL) 全面指南:PIL基础入门-Python图像处理实战
  • 多版本兼容的golang客服系统
  • 稀土:从“稀有”到“命脉”的科技核心
  • 通过概率正 - 未标记网络从医学图像的特定感兴趣区域中学习|文献速递-深度学习人工智能医疗图像
  • 【底层机制】thread_local 变量的初始化时机和生命周期
  • Spring Retry Spring 生态系统优雅的重试组件
  • 浏览器网页路径扫描器(脚本)
  • SQL优化:SQL模拟Split二维数组
  • Linux 基础开发工具
  • django-redis 使用类实现和使用
  • React(面试)
  • JUC之异步编程理论总结
  • 实现基于数据库 flag 状态的消息消费控制
  • 【docker】P1 虚拟化与容器化
  • 全球协作无障碍:cpolar+Nextcloud实现跨国文件共享
  • 通过远程桌面横向移动(破解凭证)
  • 【51单片机】【protues仿真】 基于51单片机出租车计价器系统
  • 三轴云台之动态性能篇
  • 数字化时代催生变革,楼宇自控系统成为建筑管理新潮流的引领者
  • ESP32S3:开发环境搭建、VSCODE 单步调试、Systemview 分析任务运行情况
  • 北斗导航|接收机自主完好性监测算法综述
  • 【C++】类和对象 --- 类中的6个默认成员函数
  • CAS 浅析
  • 视觉语言模型应用开发——Qwen 2.5 视觉语言模型的零样本学习能力在多模态内容审核中的实践研究
  • 把CentOS 7默认yum源改成腾讯云镜像
  • 阿里云——云存储与数据库服务
  • RustFS架构解密:零GC设计如何实现12μs级存储延迟?