学习目标
- 理解本节涉及的核心主题:Linux 进程管理、守护进程与服务、什么是守护进程?、
systemd与init系统。 - 掌握重点命令或工具:
systemd、init、systemctl、nice、renice。 - 能够结合示例完成常见操作,并理解关键参数、使用场景与结果差异。
- 能够识别本节相关的常见风险、易错点或排查思路。
学习重点
- 主题范围:Linux 进程管理、守护进程与服务、什么是守护进程?、
systemd与init系统、管理系统服务(systemctl)、进程优先级与调度 - 重点命令:
systemd、init、systemctl、nice、renice - 学习重点:命令用途、关键参数、典型场景、与相近命令的区别
- 复习方式:先理解场景,再动手练习,最后对照结果检查
Linux 进程管理
守护进程与服务
守护进程是系统后台运行的服务进程,负责处理各种系统任务,如网络服务、定时任务、日志记录等。理解守护进程的概念和管理方法,是系统管理的重要技能。
什么是守护进程?
定义与特点
**守护进程(Daemon)**是指在后台运行、不与任何终端交互的进程,通常在系统启动时自动启动,并在整个系统运行期间持续运行,提供各种系统服务。
主要特点:
- 后台运行:不与用户直接交互,通过日志或配置文件提供信息。
- 持久性:通常随系统启动而启动,并在系统关闭前一直运行。
- 独立性:与其他进程相互独立,常作为系统服务运行。
常见守护进程示例(如 sshd, httpd, cron)
sshd:提供 SSH 服务,允许远程登录和命令执行。httpd/nginx:提供 Web 服务,处理 HTTP 请求。cron:定时任务调度服务,执行预定的任务脚本。syslogd:系统日志服务,收集和记录系统日志。mysqld:MySQL 数据库服务,管理数据库操作。
守护进程的创建与管理
守护进程通常由系统启动脚本或服务管理工具(如 systemd)创建和管理。开发自定义守护进程时,需要遵循特定的创建规范,如分离终端、创建新会话、关闭文件描述符等。
创建守护进程的基本步骤:
- 分离终端:确保守护进程不与任何终端关联。
- 创建新会话:调用
setsid()创建新会话,脱离控制终端。 - 更改工作目录:通常更改到根目录,避免占用挂载点。
- 重定向文件描述符:将标准输入、输出和错误重定向到
/dev/null或日志文件。 - 处理信号:捕获和处理必要的信号,确保守护进程稳定运行。
示例:
以下是一个简单的 C 程序示例,展示如何创建一个守护进程:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main() {
pid_t pid;
// 创建子进程
pid = fork();
if (pid < 0) exit(EXIT_FAILURE);
if (pid > 0) exit(EXIT_SUCCESS);
// 创建新会话
if (setsid() < 0) exit(EXIT_FAILURE);
// 捕获并忽略信号
signal(SIGCHLD, SIG_IGN);
signal(SIGHUP, SIG_IGN);
// 再次 fork 子进程
pid = fork();
if (pid < 0) exit(EXIT_FAILURE);
if (pid > 0) exit(EXIT_SUCCESS);
// 更改工作目录
chdir("/");
// 重置文件权限掩码
umask(0);
// 关闭所有打开的文件描述符
for (int x = sysconf(_SC_OPEN_MAX); x >= 0; x--) {
close(x);
}
// 打开日志文件
open("/var/log/mydaemon.log", O_CREAT | O_WRONLY | O_APPEND, 0600);
// 守护进程的主循环
while (1) {
// 执行任务
sleep(30);
}
exit(EXIT_SUCCESS);
}
说明:
- 创建子进程并终止父进程,确保守护进程与终端分离。
- 创建新会话和进程组,进一步分离进程。
- 更改工作目录到根目录,避免占用挂载点。
- 关闭所有文件描述符,确保守护进程不与任何文件关联。
- 打开日志文件,用于记录守护进程的活动。
- 主循环中执行守护进程的核心任务。
systemd 与 init 系统
现代 Linux 发行版主要使用 systemd 作为初始化系统和服务管理器,而传统的 init 系统仍在一些老旧系统中使用。理解这两者的基本概念和功能,有助于更有效地管理系统服务。
init 系统的基本概念与功能
init 是 Unix 系统中的第一个用户空间进程,负责系统启动过程中的初始化工作,如挂载文件系统、启动系统服务等。传统的 init 系统使用运行级别(runlevels)来管理系统状态,每个运行级别对应不同的服务集。
常见运行级别:
| 运行级别 | 描述 |
|---|---|
| 0 | 关机 |
| 1 | 单用户模式 |
| 2 | 多用户模式,无网络 |
| 3 | 多用户模式,有网络 |
| 4 | 用户自定义 |
| 5 | 多用户模式,有图形界面 |
| 6 | 重启 |
管理服务:
通过编辑 /etc/init.d/ 目录下的脚本,控制服务的启动和停止。
示例:启动 ssh 服务
sudo /etc/init.d/ssh start
systemd 的基本概念与功能
systemd 是现代 Linux 系统中的初始化系统和服务管理器,取代了传统的 init 系统,提供了更高效和灵活的服务管理方式。systemd 使用单元(unit)文件来定义和管理服务、挂载点、设备等资源。
主要特点:
- 并行启动:加快系统启动速度。
- 依赖管理:自动处理服务间的依赖关系。
- 统一管理:通过统一的命令和接口管理所有系统资源。
- 日志管理:集成
journald提供统一的日志记录。
systemd 与 init 的比较
| 特性 | init |
systemd |
|---|---|---|
| 启动速度 | 较慢,顺序启动 | 较快,并行启动 |
| 服务依赖管理 | 手动管理,依赖关系复杂 | 自动管理,依赖关系清晰 |
| 日志管理 | 依赖外部日志系统 | 集成 journald,统一日志记录 |
| 单一工具 | 多种工具分别管理服务 | 单一命令(systemctl)管理所有服务 |
| 配置方式 | 脚本化配置 | 单元文件配置 |
| 功能扩展 | 功能有限 | 功能丰富,支持快照、定时任务等高级功能 |
systemd 的优势与特点
- 高效并行启动:通过并行启动服务,显著提高系统启动速度。
- 统一管理工具:使用
systemctl命令统一管理所有服务和资源。 - 动态管理:支持动态添加、删除和修改服务配置,无需重启系统。
- 丰富的功能:支持服务监控、自动重启、资源限制、容器管理等高级功能。
- 集成日志:通过
journald提供统一和结构化的日志记录,便于日志分析和管理。
示例:启动和管理 nginx 服务
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl status nginx
sudo systemctl enable nginx
sudo systemctl disable nginx
总结
systemd 提供了更高效、灵活和统一的服务管理方式,适用于现代 Linux 系统的需求。相比传统的 init 系统,systemd 通过并行启动、自动依赖管理和丰富的功能,显著提升了系统的性能和可管理性。
管理系统服务(systemctl)
systemctl 是 systemd 的主要管理工具,用于控制系统服务的启动、停止、重启和状态查询。掌握 systemctl 的使用,有助于高效地管理和维护系统服务。
启动与停止服务
1. 启动服务
命令语法:
sudo systemctl start service_name
示例:启动 nginx 服务
sudo systemctl start nginx
2. 停止服务
命令语法:
sudo systemctl stop service_name
示例:停止 nginx 服务
sudo systemctl stop nginx
重启与重新加载服务
1. 重启服务
重启服务通常用于应用配置更改或恢复服务的正常运行。
命令语法:
sudo systemctl restart service_name
示例:重启 nginx 服务
sudo systemctl restart nginx
2. 重新加载服务
部分服务支持重新加载配置文件而无需完全重启进程,减少服务中断时间。
命令语法:
sudo systemctl reload service_name
示例:重新加载 nginx 配置
sudo systemctl reload nginx
查看服务状态
查看服务的当前状态、运行时间、日志等信息,帮助诊断和监控服务运行情况。
命令语法:
sudo systemctl status service_name
示例:查看 nginx 服务状态
sudo systemctl status nginx
输出示例:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-04-27 10:30:15 UTC; 1h 5min ago
Docs: man:nginx(8)
Main PID: 2001 (nginx)
Tasks: 3 (limit: 1153)
CGroup: /system.slice/nginx.service
├─2001 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
├─2002 nginx: worker process
└─2003 nginx: worker process
关键字段解释:
- Loaded:服务单元文件的加载状态和路径。
- Active:服务的活动状态,如
active (running)、inactive、failed等。 - Main PID:主进程的 PID。
- Tasks:服务占用的任务数量。
- CGroup:进程所属的控制组。
- COMMAND:启动服务的命令及参数。
启用与禁用服务自动启动
通过 systemctl 可以设置服务在系统启动时自动启动,或禁止自动启动。
1. 启用服务自动启动
命令语法:
sudo systemctl enable service_name
示例:启用 nginx 服务开机自启
sudo systemctl enable nginx
2. 禁用服务自动启动
命令语法:
sudo systemctl disable service_name
示例:禁用 nginx 服务开机自启
sudo systemctl disable nginx
常见服务管理实例
实例 1:管理 cron 服务
- 启动
cron服务sudo systemctl start cron - 查看
cron服务状态sudo systemctl status cron - 启用
cron服务自动启动sudo systemctl enable cron
实例 2:管理 sshd 服务
- 启动
sshd服务sudo systemctl start sshd - 重启
sshd服务sudo systemctl restart sshd - 查看
sshd服务状态sudo systemctl status sshd - 禁用
sshd服务自动启动sudo systemctl disable sshd
实例 3:管理自定义服务
假设有一个自定义的守护进程 mydaemon,其服务单元文件位于 /etc/systemd/system/mydaemon.service。
- 启动
mydaemon服务sudo systemctl start mydaemon - 查看
mydaemon服务状态sudo systemctl status mydaemon - 启用
mydaemon服务自动启动sudo systemctl enable mydaemon - 停止并禁用
mydaemon服务sudo systemctl stop mydaemon sudo systemctl disable mydaemon
进程优先级与调度
进程优先级和调度策略决定了进程获取 CPU 资源的顺序和频率,影响系统的响应性和性能。通过调整进程优先级,可以优化关键任务的执行效率。
进程优先级概念
进程优先级(Nice Value)
Nice Value 是用于影响进程调度优先级的一个值,范围通常从 -20(最高优先级)到 19(最低优先级)。较低的 Nice 值表示较高的优先级,反之亦然。
默认 Nice 值: 0
查看进程的 Nice 值:
使用 ps 命令:
ps -o pid,ni,cmd -p 1500
输出示例:
PID NI CMD
1500 0 ./backup.sh
调整 Nice Value
通过 nice 和 renice 命令,可以调整进程的 Nice 值,影响其优先级。
1. 启动进程时设置 Nice 值
命令语法:
nice -n [nice_value] command [args]
示例:以 Nice 值 10 启动一个备份脚本
nice -n 10 ./backup.sh
说明:
-n 10:设置 Nice 值为10,降低进程优先级。
2. 调整已运行进程的 Nice 值
命令语法:
renice [nice_value] -p PID
示例:将 PID 为 1500 的进程 Nice 值设置为 -5
sudo renice -5 -p 1500
说明:
-5:提高进程优先级。-p 1500:指定进程 PID。
进程调度策略
Linux 支持多种进程调度策略,决定了进程如何获取 CPU 资源。
常见调度策略:
SCHED_OTHER(默认):普通的时间共享调度策略。SCHED_FIFO:实时的先到先服务策略,适用于需要高优先级的任务。SCHED_RR:实时的轮询调度策略,结合了时间共享和实时优先级。SCHED_BATCH:适用于批处理任务,优先级较低。SCHED_IDLE:最低优先级,系统空闲时才运行。
查看进程调度策略:
使用 chrt 命令:
chrt -p 1500
输出示例:
pid 1500's current scheduling policy: SCHED_OTHER
pid 1500's current scheduling priority: 0
调整进程调度策略:
使用 chrt 命令设置调度策略和优先级。
示例:将 PID 为 1500 的进程设置为 SCHED_FIFO,优先级 10
sudo chrt -f 10 -p 1500
说明:
-f:设置为SCHED_FIFO调度策略。10:设置调度优先级。-p 1500:指定进程 PID。
注意事项:
- 实时调度策略:如
SCHED_FIFO和SCHED_RR,应谨慎使用,避免占用过多 CPU 资源,影响系统响应。 - 权限要求:调整进程优先级和调度策略通常需要超级用户权限。
使用 nice 和 renice 调整进程优先级
nice 和 renice 是 Linux 中用于调整进程优先级的命令,帮助用户优化系统资源分配。
nice - 启动进程时设置优先级
命令语法:
nice -n [nice_value] command [args]
示例:以 Nice 值 15 启动一个数据分析脚本
nice -n 15 python3 analyze_data.py
说明:
-n 15:设置 Nice 值为15,降低进程优先级。python3 analyze_data.py:执行数据分析脚本。
效果:
进程将以较低的优先级运行,不会抢占系统中高优先级的进程资源。
renice - 调整已运行进程的优先级
命令语法:
renice [nice_value] -p PID
示例:将 PID 为 1500 的进程 Nice 值设置为 5
renice 5 -p 1500
说明:
5:设置 Nice 值为5,略微提高进程优先级。-p 1500:指定进程 PID。
高级示例:
调整多个进程的优先级:
renice 10 -p 1500 1501 1502
效果:
将 PID 为 1500、1501 和 1502 的进程 Nice 值设置为 10,降低它们的优先级。
组合使用命令实例
示例 1:以低优先级启动一个资源密集型任务
nice -n 19 tar -czvf backup.tar.gz /home/alice/Documents
说明:
-n 19:设置 Nice 值为19,最大程度降低进程优先级。tar -czvf backup.tar.gz /home/alice/Documents:打包并压缩Documents目录。
示例 2:调整正在运行的进程优先级
假设进程 2001 是一个后台数据处理进程,占用大量 CPU 资源。
-
查看进程当前 Nice 值:
ps -o pid,ni,cmd -p 2001PID NI CMD 2001 0 data_processor -
降低进程优先级:
renice 10 -p 2001 -
验证修改:
ps -o pid,ni,cmd -p 2001PID NI CMD 2001 10 data_processor
注意事项:
- 权限要求:调整进程优先级通常需要超级用户权限,尤其是提高进程优先级(降低 Nice 值)。
- 最小权限原则:仅对需要优化的进程进行优先级调整,避免系统关键进程被错误修改。
进程间通信(IPC)
进程间通信(IPC)是指不同进程之间交换数据和信息的机制,支持进程协作和资源共享。Linux 提供了多种 IPC 方式,包括管道、命名管道(FIFO)、信号、消息队列、共享内存和信号量等。
本节总结
- 本节主要围绕 Linux 进程管理、守护进程与服务、什么是守护进程?、
systemd与init系统、管理系统服务(systemctl) 展开。 - 需要重点掌握的命令或工具包括:
systemd、init、systemctl、nice、renice。 - 学习时应优先抓住「命令解决什么问题、在什么场景下使用、执行后会产生什么结果」。
- 对涉及权限、覆盖、网络、系统服务、删除或安全配置的操作,建议先在测试环境练习。
复习建议
- 先用自己的话复述本节每个主题或命令的作用,避免只记参数不懂用途。
- 按原文示例至少手敲一遍典型命令,并观察输出变化。
- 对高风险操作先确认路径、权限和目标对象,再执行实际命令。
- 可优先复习这些高频命令:
systemd、init、systemctl、nice、renice。