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.
子进程完成任务后调用
exit()
系统调用,向父进程发送终止信号。 - 2.
子进程释放自身占用的大部分资源(如内存、文件句柄),但可能残留部分未完全清理的结构(如进程控制块PCB的部分信息),此时称为僵尸进程(Zombie)。
- 3.
父进程通过
wait()
或waitpid()
系统调用接收子进程的终止信号,回收僵尸进程的残留资源,避免系统资源泄漏。 - 4.
若父进程先于子进程终止(异常情况),子进程会被
init/systemd
进程接管(PPID变为1),并由其最终清理。
- 1.
关键问题:僵尸进程本身不占用CPU/内存,但会占用PID资源(若大量堆积可能导致系统无法创建新进程)。正常情况下,父进程会主动回收子进程;若出现僵尸进程,需检查父进程是否异常(如未正确实现wait逻辑)。
二、Linux程序管理:从安装到运维
1. 课程目标与核心技能
- •
掌握:Linux系统下软件的安装方法(RPM/YUM/源码/二进制)、软件包管理命令(rpm/yum/dnf)、yum源配置(本地/网络)、systemd服务管理机制。
- •
应用:根据场景选择合适的安装方式,解决依赖问题,配置服务开机自启及故障排查。
2. 常见软件包类型与特性
类型 | 后缀/格式 | 适用系统 | 特点 | 依赖管理 |
---|---|---|---|---|
RPM包 |
| RedHat/CentOS | 预编译的二进制包,包含默认安装路径(如 | 需通过 |
DEB包 |
| Debian/Ubuntu | 类似RPM,专为Debian系设计,默认路径和配置规则与RPM不同,依赖同样需手动处理。 | 依赖 |
二进制包 |
| 通用 | 直接可执行的安装脚本(本质是编译好的二进制文件+安装逻辑),双击或运行后自动解压到指定目录(如 | 通常无复杂依赖(可能需基础库如glibc)。 |
源码包 |
| 通用 | 原始代码文件,需用户手动编译(通过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.
查看状态:
systemctl status nginx.service
→ 检查“Active:”行(running表示正常,failed表示失败)。 - 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.
通用排查命令:
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包 |
|
YUM安装 |
|
源码安装 |
|
Systemd管理 |
|
日志排查 |
|