Linux 计划任务 + 进程调度 + 文件系统
本文详细讲解 linux 的 周期性计划任务、进程调度与优先级管理、文件系统与磁盘管理,兼顾操作命令+底层原理+易错排错,帮助建立完整的知识体系。
文章目录
- Linux 计划任务 + 进程调度 + 文件系统
-
- 第一章 Linux 周期性计划任务
-
- 1.1 计划任务概述与 cron 整体架构
-
- 什么是周期性计划任务
- cron 三大组成部分
- 1.2 用户级计划任务:crontab
-
- 1.2.1 时间格式详解
-
- 时间字段的通用语法
- 示例对照
- 1.2.2 常用命令与参数
- 1.2.3 环境变量与特殊符号
-
- 环境变量问题(新手第一大坑)
- `%` 特殊符号
- 1.2.4 任务输出与日志排错
-
- 为什么 cron 日志里看不到报错
- 查看报错的两个途径
- 1.3 系统级计划任务
-
- 1.3.1 /etc/crontab 与 /etc/cron.d/
-
- 两者的区别
- 语法差异
- 1.3.2 anacron:保证执行的延时任务
-
- 为什么需要 anacron
- 工作原理
- /etc/anacrontab 配置格式
- 1.3.3 系统周期目录
- 1.4 计划任务常见排错思路
- 第二章 Linux 进程调度与优先级管理
-
- 2.1 进程调度基本原理
-
- 为什么需要进程调度
- 两个核心概念
- 2.2 调度器分类与策略
-
- 2.2.1 实时调度器
- 2.2.2 非实时调度器
- 2.2.3 实时进程的 CPU 时间限制
- 2.3 非实时进程优先级:nice 值
-
- 2.3.1 nice 值的含义与范围
- 2.3.2 nice:启动时指定优先级
-
- 权限限制
- 2.3.3 renice:运行中修改优先级
-
- 权限限制
- 2.3.4 继承特性
- 2.4 实时调度管理:chrt 命令
- 2.5 优先级体系总结
- 第三章 Linux 文件系统与磁盘管理
-
- 3.1 块设备与磁盘分区
-
- 3.1.1 块设备概念与命名规则
- 3.1.2 磁盘分区的意义
- 3.2 文件系统基础
-
- 3.2.1 什么是文件系统
- 3.2.2 主流文件系统对比
- 3.3 磁盘与文件系统查看工具
-
- 3.3.1 lsblk:查看块设备层级结构
- 3.3.2 df:查看文件系统空间使用率
- 3.3.3 du:查看目录/文件实际占用空间
- 3.3.4 df 和 du 结果不一致的经典原因
- 3.4 挂载与卸载
-
- 3.4.1 挂载的本质
- 3.4.2 mount 命令与常用选项
- 3.4.3 挂载遮蔽现象
- 3.4.4 umount 卸载与 busy 问题处理
-
- 常见报错:device is busy(设备正忙)
- 3.4.5 特殊文件系统挂载案例
-
- 挂载 NTFS 格式 U盘
- 挂载 exFAT 格式 U盘
- 挂载 ISO 镜像文件
- 3.5 文件查找工具
-
- 3.5.1 locate:数据库快速查找
- 3.5.2 find:实时精准查找
-
- 常用匹配条件
- 常用动作
- 3.5.3 实战:查找系统大文件
- 补充:LVM 逻辑卷管理(扩展知识)
第一章 Linux 周期性计划任务
1.1 计划任务概述与 cron 整体架构
什么是周期性计划任务
按照预设的时间规则,自动、重复执行指定命令或脚本的机制,类似 Windows 的「任务计划程序」。常用于日志切割、数据备份、定时巡检、系统清理等自动化场景。
cron 三大组成部分
Linux 的计划任务由 cron 体系实现,包含三层结构:
💡 核心区分:
- 用户级任务:每个用户自己管理,互不干扰,存在 /var/spool/cron/用户名 文件中。
- 系统级任务:管理员配置,用于系统全局维护,存放在 /etc/crontab 和 /etc/cron.d/ 目录下。
1.2 用户级计划任务:crontab
1.2.1 时间格式详解
每条任务固定由 5个时间字段 + 1个命令字段 组成,顺序严格固定:
分钟 小时 几号 月份 星期几 要执行的命令
| 分钟 | 0-59 | 每小时的第几分钟执行 |
| 小时 | 0-23 | 当天的第几个小时执行 |
| 几号 | 1-31 | 当月的第几天执行 |
| 月份 | 1-12 | 当年的第几月执行 |
| 星期几 | 0-7 | 周几执行;0和7都代表周日,1代表周一 |
时间字段的通用语法
| * | 任意值,代表「每…都执行」 | 分钟位写* = 每分钟都执行 |
| x-y | 连续范围 | 小时位 9-18 = 上午9点到下午6点之间 |
| x,y,z | 离散列表 | 分钟位 5,15,30 = 第5、15、30分钟各执行一次 |
| */x | 间隔x单位 | 分钟位 */5 = 每隔5分钟执行一次 |
⚠️ 重要易错点: 「几号」和「星期几」是逻辑或的关系,只要满足其中一个条件就会触发,而不是同时满足。 例如:0 12 15 * 3 不是「每月15号且周三才执行」,而是「每月15号 + 每周三」都会执行。
示例对照
# 每天凌晨2点30分执行备份脚本
30 2 * * * /usr/local/bin/backup.sh
# 工作日(周一到周五)上午9点整执行打卡脚本
0 9 * * 1-5 /usr/local/bin/checkin.sh
# 7月份每周五,9点到16点之间每5分钟执行一次
*/5 9-16 * Jul 5 echo "Time check"
# 每隔2天的晚上11点58分执行日报脚本
58 23 */2 * * /usr/local/bin/daily_report.sh
1.2.2 常用命令与参数
| crontab -l | 查看当前用户的所有计划任务 | 只看自己的,看不到其他用户 |
| crontab -e | 编辑当前用户的计划任务 | 默认用 vi 编辑器,保存后自动生效 |
| crontab -r | 删除当前用户所有计划任务 | 高危操作!没有回收站,删除即永久丢失 |
| crontab -u 用户名 | root 专属,管理指定用户的任务 | 例:crontab -u hero -l 查看hero的任务 |
| crontab 文件名 | 用文件里的内容覆盖当前所有任务 | 批量导入配置用,会覆盖原有全部任务 |
💡 新手建议: 不要用 crontab -r,想删除单条任务直接 crontab -e 进去注释或删除对应行即可,避免误删全部任务。
1.2.3 环境变量与特殊符号
环境变量问题(新手第一大坑)
crontab 执行任务时,不会加载用户终端的完整环境变量,默认只有极简的 PATH,非常容易出现「终端手动跑没问题,cron 执行就报错找不到命令」。
解决方法:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
% 特殊符号
crontab 的命令中,% 有特殊含义:代表换行,% 后面的内容会作为命令的标准输入。 如果想表示普通的百分号,必须转义写成 \\%。
1.2.4 任务输出与日志排错
如果任务的命令没有手动重定向输出,那么所有的标准输出和错误输出,都会通过系统内部邮件发送给任务所属用户,而不会打印在终端。
为什么 cron 日志里看不到报错
/var/log/cron 只记录「调度动作本身」(什么时候触发了哪条命令),不记录命令的执行结果和报错。
查看报错的两个途径
*/5 * * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
`>>` 追加正常输出,`2>&1` 把错误输出也合并到同一个日志。
1.3 系统级计划任务
1.3.1 /etc/crontab 与 /etc/cron.d/
两者的区别
- /etc/crontab:系统主配置文件,不建议直接修改,系统更新 cron 包时可能会覆盖。
- /etc/cron.d/:系统任务的标准存放目录,自定义任务在这里新建文件,不会被系统更新覆盖,软件包也会把自己的计划任务放到这里。
语法差异
系统级任务比用户级任务多一个用户字段,指定用哪个用户身份执行命令:
分钟 小时 几号 月份 星期几 执行用户 命令
示例:
# 每小时第1分钟,以root身份执行/etc/cron.hourly下的所有脚本
01 * * * * root run-parts /etc/cron.hourly
1.3.2 anacron:保证执行的延时任务
为什么需要 anacron
普通 cron 是严格按时触发,如果机器关机错过了时间,任务就直接跳过了。anacron 就是为了解决这个问题:它保证任务一定会被执行,只是时间可能延迟。
工作原理
anacron 记录任务上次执行的时间,开机后检查如果超过周期没执行,就会等待指定延迟后补执行。 适合笔记本、不24小时开机的服务器,保证每日/每周/每月的维护任务不会因为关机漏掉。
/etc/anacrontab 配置格式
每行四个字段:
周期(天) 延迟(分钟) 任务标识 执行命令
示例:
# 每天的任务,开机延迟5分钟执行,任务标识cron.daily
1 5 cron.daily nice run-parts /etc/cron.daily
# 每周的任务,开机延迟25分钟执行
7 25 cron.weekly nice run-parts /etc/cron.weekly
# 每月的任务,开机延迟45分钟执行
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
1.3.3 系统周期目录
系统预置了四个任务目录,对应不同执行频率:
- /etc/cron.hourly:每小时执行一次里面的所有脚本
- /etc/cron.daily:每天执行一次
- /etc/cron.weekly:每周执行一次
- /etc/cron.monthly:每月执行一次
由 run-parts 工具负责执行目录下的所有脚本,要求脚本必须有可执行权限,且文件名不能包含特殊字符。
💡 小技巧: 想加一个每天执行的系统任务,直接把写好的脚本加执行权限丢进 /etc/cron.daily 即可,不用手动写 crontab 配置。
1.4 计划任务常见排错思路
任务不执行时,按以下顺序排查:
- 没触发:检查时间格式、crond服务是否运行。
- 已触发:说明是命令执行问题,继续往下查。
第二章 Linux 进程调度与优先级管理
2.1 进程调度基本原理
为什么需要进程调度
系统中的进程/线程数量,远多于 CPU 核心数量。Linux 通过分时复用的方式,让多个进程轮流使用 CPU,宏观上看起来像是「同时运行」。
进程调度器就是内核的「调度总管」,负责决定:
- 哪个进程接下来获得 CPU
- 每个进程能使用多久 CPU
- 优先级高的进程优先获得更多 CPU 时间
两个核心概念
- 时间片:每个进程一次能占用 CPU 的时长,通常 10-20ms。时间片用完就切换给下一个进程。
- 优先级:进程获得 CPU 能力的等级。高优先级进程能获得更多 CPU 时间,低优先级进程在 CPU 繁忙时让步。
2.2 调度器分类与策略
Linux 调度器分为两大类:实时调度器 和 非实时调度器,实时调度器的所有进程,优先级永远高于非实时进程。
2.2.1 实时调度器
用于对响应速度要求极高的场景,比如工业控制、音视频处理。
| SCHED_FIFO | 先入先出调度 | 进程一旦获得 CPU,就一直运行,直到主动放弃(IO阻塞)或被更高优先级进程抢占 | 相同优先级下,先来先服务,没有时间片 |
| SCHED_RR | 轮询调度 | 相同优先级的进程,轮流分配相同的时间片,时间片用完就换下一个 | 公平轮转,是实时调度的默认策略 |
实时优先级范围:1-99,数值越大优先级越高。
2.2.2 非实时调度器
系统中绝大多数普通进程使用的调度器。
| SCHED_NORMAL(SCHED_OTHER) | 标准分时调度 | 绝大多数普通进程,系统默认 |
| SCHED_BATCH | 批量调度 | 后台批量任务,减少调度频率,长时间运行,牺牲响应换吞吐量 |
| SCHED_IDLE | 空闲调度 | 极低优先级,只有系统完全空闲时才运行,优先级比 nice 19 还低 |
2.2.3 实时进程的 CPU 时间限制
如果实时进程一直占满 CPU,系统其他普通进程(包括 SSH)都会卡死。Linux 通过两个 sysctl 参数做保护:
- kernel.sched_rt_period_us:调度周期,默认 1000000 微秒(1秒)
- kernel.sched_rt_runtime_us:实时进程在一个周期内最多能使用的 CPU 时间,默认 950000 微秒(0.95秒)
也就是说,每秒至少预留 0.05 秒给非实时进程,保证系统基本响应。
2.3 非实时进程优先级:nice 值
2.3.1 nice 值的含义与范围
nice 值是针对非实时进程的相对优先级,范围 -20 ~ 19。
⚠️ 最容易记反的点:
- nice 值越高,优先级越低,进程越「谦让」,获得 CPU 能力越弱
- nice 值越低,优先级越高,进程越「强势」,获得 CPU 能力越强
- 默认值为 0
只有当 CPU 资源紧张时,nice 值的差异才会体现;CPU 空闲时,所有进程都能跑满。
2.3.2 nice:启动时指定优先级
在启动程序时直接指定 nice 值:
# 默认不加参数,nice 值加10(即优先级为10)
nice md5sum /dev/zero &
# 手动指定 nice 值
nice -n -5 md5sum /dev/zero &
权限限制
- 普通用户:只能设置正数的 nice 值(降低自己进程的优先级),不能设置负数。
- root 用户:可以设置 -20 ~ 19 任意值。
2.3.3 renice:运行中修改优先级
修改已经在运行的进程的 nice 值:
# 把PID为1234的进程nice值改为5
renice -n 5 1234
# 按用户批量修改所有进程的优先级
renice -n 10 -u hero
权限限制
- 普通用户:只能调高自己进程的 nice 值(降低优先级),不能调低。
- root 用户:可以任意修改所有进程的 nice 值。
2.3.4 继承特性
子进程会继承父进程的 nice 值。比如在 bash 里启动的程序,nice 值和当前 bash 一致,默认都是 0。
2.4 实时调度管理:chrt 命令
chrt 用来查看和修改进程的调度策略与实时优先级,注意:它不能调整 nice 值,nice 和 chrt 是两套独立的体系。
# 查看系统支持的调度策略和优先级范围
chrt -m
# 以RR调度、优先级5启动程序
chrt -r 5 md5sum /dev/zero &
# 修改运行中进程的调度策略为FIFO,优先级10
chrt -f –pid 10 1234
# 把进程改回普通非实时调度
chrt -o –pid 0 1234
2.5 优先级体系总结
优先级从高到低:
实时进程(优先级1-99) > 非实时进程(nice -20 ~ 19)
- 优先级最低的实时进程,也比优先级最高的非实时进程优先级高。
- nice 只在非实时进程内部有相对意义,和实时进程不在一个维度。
第三章 Linux 文件系统与磁盘管理
3.1 块设备与磁盘分区
3.1.1 块设备概念与命名规则
Linux 中所有存储设备都以「块设备文件」的形式存在于 /dev 目录下,由系统自动创建。
不同接口的设备命名不同:
| SATA/SCSI/SAS/USB | /dev/sda、/dev/sdb… | 按识别顺序a、b、c排序,虚拟机常用的SCSI磁盘也用这个 |
| 半虚拟化磁盘 | /dev/vda、/dev/vdb… | KVM等虚拟机的virtio磁盘,性能更好 |
| NVMe 固态硬盘 | /dev/nvme0n1、/dev/nvme1n1… | 第0个控制器第1个命名空间 |
| SD/MMC卡 | /dev/mmcblk0 | 内存卡、嵌入式存储 |
分区命名:在设备名后面加数字,比如 sda 的第一个分区是 sda1,第二个是 sda2。
3.1.2 磁盘分区的意义
分区就是把一块物理磁盘,逻辑上划分成多个独立的存储区域。
为什么要分区,而不是整块盘直接用?
💡 补充:分区表不是必须的 Linux 支持直接在整块磁盘上创建文件系统(不分区),但不符合规范,兼容性差,生产环境永远先分区再使用。
3.2 文件系统基础
3.2.1 什么是文件系统
磁盘本身只是一堆可以读写的扇区,只能存 0 和 1,它不知道什么是文件、目录、文件名。 文件系统就是一套「磁盘数据组织规则」,负责管理:
- 文件怎么拆分存储到扇区
- 怎么索引文件的位置(inode机制)
- 空闲空间怎么分配和回收
- 异常断电后怎么恢复数据
「格式化」的本质,就是在分区里写入这套文件系统的管理结构(超级块、inode表、数据区等)。
3.2.2 主流文件系统对比
| XFS | Linux | 高性能、大文件优化、支持在线扩容 | CentOS默认、服务器数据盘 | ❌ 只支持扩容,不支持缩容 |
| ext4 | Linux | 稳定成熟、功能全面、支持在线扩容缩容 | 通用Linux发行版 | ✅ 支持 |
| NTFS | Windows | 权限管理完善、日志、压缩加密 | Windows系统盘/数据盘 | ✅ 支持 |
| FAT32 | 跨平台通用 | 兼容性极强、结构简单 | 老式U盘、内存卡 | ❌ 原生不支持 |
| exFAT | 跨平台通用 | 突破4GB单文件限制、轻量 | 现代U盘、移动硬盘 | ❌ 原生不支持 |
💡 跨平台兼容性: Windows 默认不认 XFS/ext4;Linux 默认不认 NTFS/exFAT,需要安装额外驱动。 只有 FAT32/exFAT 是全平台通用的移动存储格式。
3.3 磁盘与文件系统查看工具
3.3.1 lsblk:查看块设备层级结构
作用:以树状结构展示所有块设备的层级关系、大小、类型、挂载点。
lsblk
输出字段说明:
- NAME:设备/分区名称
- SIZE:容量大小
- TYPE:类型(disk磁盘/part分区/lvm逻辑卷/rom光驱)
- MOUNTPOINT:挂载点
最适合用来快速看清磁盘、分区、LVM逻辑卷的层级关系。
3.3.2 df:查看文件系统空间使用率
作用:查看所有已挂载文件系统的总容量、已用空间、剩余空间、使用率。
常用参数:
- -h:人性化显示单位(GB/MB),按1024进制
- -H:按1000进制显示
- -T:额外显示文件系统类型
# 查看所有挂载点,带类型和人性化单位
df -hT
# 只看根分区
df -h /
3.3.3 du:查看目录/文件实际占用空间
作用:统计目录或文件实际占用的磁盘空间大小。
常用参数:
- -s:只统计总大小,不列出子目录
- -h:人性化显示单位
# 查看/boot目录总大小
du -sh /boot
# 查看/etc下每个子目录大小,按大小排序
du -sk /etc/* | sort -n
3.3.4 df 和 du 结果不一致的经典原因
经常出现 df 显示已用很多,但 du 统计文件加起来没那么大,核心原因: 已删除但仍被进程打开的文件:
- 文件被删除后,目录里看不到了,du 不统计。
- 但进程还占用着文件句柄,磁盘空间没有释放,df 仍然统计。
解决方法:找到并重启占用文件的进程,空间就会释放。
# 查找已删除但被占用的文件
lsof | grep deleted
3.4 挂载与卸载
3.4.1 挂载的本质
Linux 的文件系统是一棵从 / 开始的目录树。要使用一个磁盘分区的文件系统,必须把它「挂接」到目录树的某个空目录上,这个目录就叫挂载点。
- 挂载前:挂载点只是根文件系统里一个普通的空目录。
- 挂载后:访问挂载点目录,实际访问的就是磁盘分区里的内容。
3.4.2 mount 命令与常用选项
mount [选项] 设备路径 挂载点目录
常用选项(-o 参数):
- ro:只读挂载
- rw:读写挂载(默认)
- noexec:禁止在该分区执行二进制程序
- remount:重新挂载,常用于修改挂载选项而不卸载
# 只读挂载
mount -o ro /dev/sdb1 /data
# 重新挂载为读写
mount -o remount,rw /data
除了设备路径,也可以用 UUID 挂载,更稳定(设备名可能变,UUID 唯一):
mount UUID="xxxx-xxxx" /data
3.4.3 挂载遮蔽现象
同一个挂载点可以挂载多个设备,但后挂载的会遮蔽先挂载的。
- 访问挂载点时,只能看到最上层设备的内容。
- 下层设备的数据不会丢失,卸载上层后会重新显露。
- 写入的数据只会进入当前最上层的设备。
卸载后挂载点目录回归普通目录,此时写入文件会落到父分区(通常是根分区),和外接设备无关。
3.4.4 umount 卸载与 busy 问题处理
# 两种写法都可以
umount 设备路径
umount 挂载点
常见报错:device is busy(设备正忙)
原因:有进程正在使用这个挂载点里的文件/目录,最常见的就是当前终端在挂载点目录里。
排查与解决:
lsof 挂载点路径
fuser -m 挂载点路径
3.4.5 特殊文件系统挂载案例
挂载 NTFS 格式 U盘
Linux 默认不识别 NTFS,需要安装驱动:
yum install -y ntfs-3g
mount.ntfs /dev/sdb1 /mnt
挂载 exFAT 格式 U盘
# 安装fuse-exfat驱动后挂载
mount.exfat /dev/sdb1 /mnt
挂载 ISO 镜像文件
mount -o loop 镜像文件.iso /mnt
loop 设备用来把文件模拟成块设备挂载。
3.5 文件查找工具
3.5.1 locate:数据库快速查找
原理:系统维护一个文件路径数据库(mlocate.db),查找时直接查数据库,速度极快,但不是实时的。
使用前准备:
yum install -y mlocate
updatedb # 更新数据库,新增文件需要更新才能查到
常用参数:
- -i:忽略大小写
- -b:只匹配文件名,不匹配路径
- -c:只返回匹配数量
# 查找所有叫passwd的文件
locate passwd
# 忽略大小写查找
locate -i PASSWD
特点:快、适合找已知文件名;缺点:不实时、找不到刚创建的文件。
3.5.2 find:实时精准查找
原理:实时遍历指定目录下的所有文件,按条件匹配,功能强大但速度慢。
find 查找路径 匹配条件 动作
常用匹配条件
# 精确匹配文件名
find /etc -name passwd
# 模糊匹配,忽略大小写
find /etc -iname '*passwd*'
- f:普通文件
- d:目录
- l:软链接
# 查找/etc下名字叫passwd的目录
find /etc -name passwd -type d
- +10M:大于10MB
- -10M:小于10MB
- 10M:等于10MB(近似取整)
# 查找系统中大于100MB的文件
find / -size +100M
- -mmin -10:10分钟内修改过
- -mtime +7:7天前修改过
- -newer 文件:比指定文件更新
# 查找系统中所有suid权限的文件
find / -perm -4000
- 逻辑与:默认,两个条件都满足
- 逻辑或:-o
- 逻辑非:!
# 查找不属于任何用户或任何组的文件
find / -nouser -o -nogroup
常用动作
- -ls:找到后显示详细信息
- -delete:找到后直接删除
- -exec 命令 {} \\;:找到后对文件执行命令,{}代表找到的文件
# 找到所有.txt文件并复制到/tmp
find . -name "*.txt" -exec cp {} /tmp \\;
3.5.3 实战:查找系统大文件
方法一:du 逐层排查
# 从根目录开始,逐层定位大目录
du -sk /* | sort -n
du -sk /usr/* | sort -n
du -sk /usr/share/* | sort -n
方法二:find 直接查找
# 查找根目录下大于1GB的文件
find / -size +1G 2>/dev/null
补充:LVM 逻辑卷管理(扩展知识)
普通物理分区划分后大小固定,调整困难。LVM(逻辑卷管理器)在物理磁盘和文件系统之间加了一层抽象,实现空间的灵活管理。
三层架构:
核心优势:在线动态扩容缩容、跨磁盘合并空间、快照备份,是服务器磁盘管理的标准方案。






