本章重点
- 进程静态/动态查看,进程树;进程前台后台切换、挂起、终止。
- Systemd 单元、
systemctl全套操作,服务开机自启配置。 - Target 运行级别临时、永久切换。
- at 一次性任务:编辑、查询、删除。
- crontab 五段时间语法,案例配置、常见排错。
7.1 Linux 系统引导与进程基础
7.1.1 Linux 系统引导完整流程
下面用 ASCII 流程图展示从 BIOS/UEFI 到 GRUB2、内核、systemd 的完整引导流程,并标注每一步的关键输出或失败点:
┌─────────────────────────────────────────────────────────────────────┐ │ Linux 系统引导完整流程 │ └─────────────────────────────────────────────────────────────────────┘ [1] 上电 │ ▼ ┌──────────────────────────────┐ │ POST 开机自检 │ │ BIOS/UEFI 检测 CPU/内存/硬盘 │ │ 关键输出:硬件自检通过 │ │ 失败点:硬件故障 → 主板蜂鸣报警 │ └──────────────────────────────┘ │ ▼ ┌──────────────────────────────┐ │ MBR / ESP 分区引导 │ │ BIOS 模式:读 MBR 主引导记录 │ │ UEFI 模式:读 ESP EFI 分区 │ │ 关键输出:找到引导程序 │ │ 失败点:MBR 损坏 → 找不到启动设备│ └──────────────────────────────┘ │ ▼ ┌──────────────────────────────┐ │ GRUB2 引导 │ │ 选择内核版本,加载 vmlinuz │ │ 加载 initramfs 驱动镜像 │ │ 关键输出:内核镜像加载完成 │ │ 失败点:内核镜像缺失 → 引导失败 │ └──────────────────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 内核初始化 │ │ 识别硬件,挂载根文件系统 / │ │ 关键输出:根文件系统挂载成功 │ │ 失败点:根分区损坏 → 内核 panic │ └──────────────────────────────┘ │ ▼ ┌──────────────────────────────┐ │ systemd (PID=1) 初始化 │ │ 根据 Target 启动各类系统服务 │ │ 关键输出:登录界面出现 │ │ 失败点:PID=1 崩溃 → 系统崩溃 │ └──────────────────────────────┘ │ ▼ 登录界面个人理解:机器上电到登录界面一整套流水线,每一步失败都会导致开不了机。BIOS/UEFI→GRUB2→内核→systemd (PID=1)。
- POST 开机自检:BIOS/UEFI 检测 CPU、内存、硬盘硬件;根据启动顺序移交控制权。硬件故障会主板蜂鸣报警。
- MBR / ESP 分区引导
- BIOS 模式:读取硬盘 MBR 主引导记录,交给 GRUB2 引导程序。MBR 损坏会报找不到启动设备。
- UEFI 模式:读取 ESP EFI 系统分区,加载 GRUB2,支持大硬盘、安全启动。
- GRUB2 引导:选择内核版本,加载
vmlinuz内核镜像、initramfs驱动镜像,把权限交给 Linux 内核。 - 内核初始化:识别硬件,挂载根文件系统
/,启动systemd。 - systemd (PID=1) 初始化:PID=1 是所有进程的始祖进程,不能 kill,杀掉直接系统崩溃。根据 Target 目标启动各类系统服务,最后给到登录界面。
7.1.2 Systemd 核心体系与进程标识
- PID、PPID
- PID:进程唯一数字 ID,操作进程靠 PID。
- PPID:父进程 ID,进程由父进程 fork 创建。
- 孤儿进程:父进程提前退出,子进程会被 PID=1 的 systemd 收养。
- Systemd Unit 单元systemd 把系统资源抽象成不同单元,配置文件存放两处:
/usr/lib/systemd/system:系统自带单元,不要手动改/etc/systemd/system:管理员自定义单元,优先级更高
表格
| 单元类型 | 后缀 | 作用 | 示例 |
|---|---|---|---|
| Service | .service | 管理后台服务进程 | sshd.service |
| Socket | .socket | 进程间通信套接字 | sshd.socket |
| Mount | .mount | 管理挂载点 | /home.mount |
| Target | .target | 一组单元集合,代表系统运行状态 | multi‑user.target |
| Timer | .timer | 定时器单元,替代 cron | chronyd.timer |
- Target 和传统运行级别对应
个人理解:Target 就是 Systemd 新版 “运行级别”,兼容老 SysVinit 数字级别。
表格
| 传统级别 | systemd target | 含义 |
|---|---|---|
| 0 | poweroff.target | 关机 |
| 1 | rescue.target | 单用户救援模式,排错 |
| 2/3/4 | multi‑user.target | 字符多用户(服务器生产环境,无图形) |
| 5 | graphical.target | 图形桌面模式 |
| 6 | reboot.target | 重启 |
7.1.3 进程查看:静态快照与动态监控
- ps:静态快照,某一瞬间进程状态,不会自动刷新
ps auxBSD 风格,看用户、CPU、内存 PID;经常搭配管道|grep 进程名ps -elfSystemV 风格,会显示 PPID 父进程,适合分析进程父子关系
ps aux关键字段:
表格
| 字段 | 说明 | 排错关注点 | |
|---|---|---|---|
| USER | 哪个用户启动进程 | 排查异常非法进程 | |
| PID | 进程 ID | kill 操作的标识 | |
| %CPU | CPU 占用百分比 | 查 CPU 飙高进程 | |
| %MEM | 内存占比 | 内存泄漏 | |
| RSS | 实际物理内存 KB | 真实占用内存 | |
| TTY | 终端 | ?代表后台守护进程无终端;pts 远程 ssh 终端 | |
| STAT | 进程状态 | R 运行,S 休眠,Z 僵尸进程 | Z 僵尸进程要处理 |
| COMMAND | 启动命令 | 识别恶意伪装进程 |
- top:动态实时监控,Linux 任务管理器,默认 3 秒刷新顶部五大块信息:系统运行时间 + 负载、进程统计、CPU、内存 Mem、交换分区 Swap。
load average:1 分钟、5 分钟、15 分钟系统负载,超过 CPU 核心数代表压力大。 wa 值高代表 IO 磁盘瓶颈;swap 持续使用代表物理内存不够。
top 交互快捷键
表格
| 按键 | 功能 |
|---|---|
| P | 按 CPU 降序排序 |
| M | 按内存降序排序 |
| k | 输入 PID 杀死进程 |
| q | 退出 top |
- pgrep:专门过滤 PID,不会产生多余 grep 进程
pgrep -l sshd #‑l同时输出PID+进程名 pgrep -l -U nginx #看nginx用户所有进程- pstree:进程树,看父子关系
pstree -p #显示PID,最常用 pstree -ap root7.1.4 进程控制:启动、挂起、终止
- 前台 & 后台启动
- 前台:直接敲命令,占用终端,命令执行完才能输入下一条。
- 后台:命令末尾加
&,放到后台跑,释放终端,适合耗时任务。输出[1] 2345,1 是任务号,2345 是 PID。
cp /dev/cdrom myiso.iso &- 任务调度(只对当前终端内的后台任务生效)
Ctrl+Z:把正在前台运行的进程挂起(停止,放后台暂停)jobs -l:查看本终端后台任务列表(任务号、PID、状态)bg 任务号:挂起任务放到后台继续运行fg 任务号:把后台任务切回前台
⚠️注意:jobs 只能看当前终端的任务;换一个 ssh 终端看不到别的终端 jobs 任务。
- 进程终止信号
优先正常终止,尽量少用
‑9强制杀,强制杀可能丢数据、损坏文件。
表格
| 方式 | 说明 |
|---|---|
Ctrl+C | 终止前台正在运行进程 |
kill PID | 发送 15 SIGTERM,正常结束,程序自己清理资源退出 |
kill -9 PID | SIGKILL 强制杀死,程序没有机会收尾,万不得已才用 |
killall 进程名 | 按进程名批量杀进程 |
pkill -U 用户名 | 杀掉该用户全部进程,处理恶意账号 |
7.2 Systemd 服务控制与启动过程优化
服务 = 常驻后台的守护进程(sshd、crond),systemctl 统一管理.service 单元。
7.2.1 systemctl 核心操作
.service后缀可以省略,systemctl start sshd等价sshd.service
表格
| 命令 | 功能 | 使用场景 |
|---|---|---|
systemctl start xxx | 启动服务 | 服务没运行 |
systemctl stop xxx | 停止服务 | 关闭业务 |
systemctl restart xxx | 重启服务,先 stop 再 start,服务会中断 | 改配置后,服务不支持 reload 时用 |
systemctl reload xxx | 重载配置,不中断进程 | 支持 reload 的服务优先选,生产少中断业务 |
systemctl status xxx | 查看状态日志,排错最重要 | 看是否 active (running),看报错 |
systemctl enable xxx | 设置开机自启 | 核心业务 |
systemctl disable xxx | 关闭开机自启 | 不需要开机启动的服务 |
systemctl is‑enabled xxx | 查询是否开机自启 | 验证配置 |
个人经验:生产环境优先 reload;只有 reload 无效才 restart,避免业务断开。status 会打印报错,排错第一看 status。
7.2.2 Target 运行级别切换
- 查看
runlevel #看旧版运行级别数字 systemctl get‑default #查看开机默认target- 临时切换(重启失效)
init 3 #切换字符界面 multi‑user.target systemctl isolate multi‑user.target init 5 #图形界面 graphical.target init 0 #关机 init 6 #重启- 永久切换(重启生效)
systemctl set‑default multi‑user.target #服务器默认字符界面7.2.3 开机服务裁剪优化
服务器很多服务默认开机启动,很多业务用不上,关掉可以节省内存,加快开机。
- 核心服务必须 enable:
sshd、crond、rsyslog、network、lvm2‑monitor - 非生产服务:bluetooth 蓝牙、atd、kdump、vsftpd,stop+disable 关掉。
操作工具:
ntsysv:字符交互式界面,空格勾选开机启动,适合批量修改。systemctl stop / disable命令行逐条操作。
查看所有单元状态:
systemctl list‑units --type=service #当前正在运行的服务 systemctl list‑unit‑files --type=service #所有服务开机自启状态 enabled/disabled7.3 计划任务管理:自动化运维
两类:at 一次性任务;crontab 周期性重复任务。
7.3.1 at:一次性计划任务(只执行一次)
依赖
atd服务,服务没启动任务不会跑。
dnf install at systemctl start atd systemctl enable atd- 设置任务:
at 时间,进入at>交互输入多条命令,Ctrl+D 提交任务
at 15:30 2025‑05‑10 at> df -h > /tmp/disk.log at> <EOT> #Ctrl+D- 管理 at 任务
atq #查看未执行的at任务,输出任务编号 atrm 1 #删除任务编号1的任务任务输出默认发送到用户系统邮箱
/var/spool/mail/用户名,建议重定向输出到日志文件。
7.3.2 crontab:周期性计划任务(生产高频)
依赖 crond 服务,系统默认开机启动。crond 监控配置文件,修改任务不需要重启服务自动生效。
- crontab 配置分类
- 用户级:
crontab -e编辑,文件存放在/var/spool/cron/用户名,每个用户独立任务。 - 系统级:
/etc/crontab、/etc/cron.d/*,管理员系统任务,不建议普通用户直接修改。
crontab 命令选项
表格
选项 作用 crontab -e编辑当前用户定时任务,vi 编辑器 crontab -l列出当前用户任务 crontab -r清空当前用户全部定时任务 crontab -u 用户名root 管理别的用户的任务 - 五段时间语法(分 时 日 月 周 + 命令)
* * * * * 绝对路径命令/脚本
表格
| 字段 | 范围 | 特殊符号 |
|---|---|---|
| 分钟 | 0‑59 | *任意;‑连续;,离散;*/n间隔 n |
| 小时 | 0‑23 | 同上 |
| 日期 | 1‑31 | 同上 |
| 月份 | 1‑12 | 同上 |
| 星期 | 0‑7 | 0 和 7 都代表周日;日期和星期是或关系,满足其一就执行 |
⚠️大坑:crontab 环境变量和登录 shell 不一样!命令必须写绝对路径;尽量写脚本,脚本内部全部使用绝对路径。
示例
#每天凌晨4点02分执行脚本 02 4 * * * /root/daily_backup.sh #每周六7点30分重启httpd 30 7 * * 6 /usr/bin/systemctl restart httpd #每5分钟执行 */5 * * * * /usr/bin/df -h >> /tmp/diskstat.log- 常见故障排错
- 任务没执行:命令用了相对路径,用 which 拿到命令绝对路径填入;crond 服务没启动;输出没写日志误以为没跑,把输出重定向日志
>> /xxx/cron.log 2>&1。 - 任务每分钟跑:分钟字段写了
*,忘记指定具体分钟。 - 脚本手动跑正常,cron 跑失败:脚本缺少环境变量,脚本开头
source /etc/profile加载系统环境。
- 任务没执行:命令用了相对路径,用 which 拿到命令绝对路径填入;crond 服务没启动;输出没写日志误以为没跑,把输出重定向日志
本章总结
- 系统启动流程:BIOS/UEFI → GRUB2 → 内核 → systemd (PID=1 始祖进程)。PID=1 不能 kill。
- 进程查看:ps 静态快照;top 动态监控;pgrep 查 PID;pstree 看进程树。
- 进程前台后台:
&后台运行,Ctrl+Z挂起,jobs/bg/fg任务调度;kill 优先 15 正常终止,‑9强制杀死慎用。 - systemctl 管理 service 服务:start/stop/restart/reload/status/enable/disable;reload 尽量代替 restart 减少业务中断。
- Target 替代传统运行级别;临时切换
systemctl isolate,永久切换systemctl set‑default multi‑user.target,服务器一般默认字符界面。 - 开机服务裁剪,关闭不需要的服务,节约资源。
- at 一次性定时任务,依赖 atd;
at编辑,atq查看,atrm删除。 - crontab 周期性任务:五段时间语法,命令必须绝对路径;日期星期逻辑是或;常见排错点。
高频命令速查表
进程管理
表格
| 命令 | 功能 |
|---|---|
ps aux | 静态查看全部进程 |
ps -elf | 看 PPID 父进程 |
top | 动态监控资源 |
pgrep -l 进程名 | 获取 PID |
pstree -p | 进程树带 PID |
jobs -l | 当前终端后台任务 |
bg %1 | 后台恢复挂起任务 |
fg %1 | 切回前台 |
kill PID | 正常终止进程 |
kill -9 PID | 强制杀死进程 |
killall 进程名 | 按名字批量杀进程 |
systemctl 服务管理
表格
| 命令 | 功能 |
|---|---|
systemctl start/stop/restart/reload xxx | 服务启停重载 |
systemctl status xxx | 查看服务状态排错 |
systemctl enable/disable xxx | 开机自启开关 |
systemctl get‑default | 查看默认 target |
systemctl set‑default multi‑user.target | 永久字符界面 |
ntsysv | 交互式配置开机自启服务 |
计划任务
表格
| 命令 | 功能 |
|---|---|
at HH:MM YYYY‑MM‑DD | 创建一次性任务,Ctrl+D 提交 |
atq | 查看 at 任务 |
atrm 任务编号 | 删除 at 任务 |
crontab -e | 编辑用户周期任务 |
crontab -l | 列出任务 |
crontab -r | 清空当前用户全部 crontab 任务 |