Linux系统管理进阶-源码安装与进程调度 Linux 系统管理进阶源码安装、计划任务与进程调度 学习日期2026-07-29 系统环境CentOS 7 作者Linux 运维学习者 目录源码安装软件自建 YUM 仓库计划任务管理进程调度管理文件系统基本管理1. 源码安装软件在 Linux 世界里虽然yum/dnf能搞定大多数软件但源码编译安装依然是运维工程师的必修课。它能让你自定义安装路径和功能模块获取最新版本而不是仓库里的旧版本深入理解软件的构建过程1.1 源码安装 NginxNginx 是一个高性能的 HTTP 和反向代理 web 服务器官方地址nginx.org标准的源码安装三部曲配置 → 编译 → 安装Step 1安装依赖yuminstallgccmakepcre-devel zlib-develgcc和make是编译工具链pcre-devel和zlib-devel是 Nginx 依赖的库。Step 2下载 解压wgethttps://nginx.org/download/nginx-1.24.0.tar.gztar-xfnginx-1.24.0.tar.gzcdnginx-1.24.0/Step 3配置最关键的一步./configure--prefix/usr/local/nginx--prefix指定安装目录所有 Nginx 相关文件都会存放在/usr/local/nginx下。Step 4编译 安装makemakeinstall⚡make负责编译make install负责安装。用串联编译成功才会执行安装。Step 5配置环境变量exportPATH$PATH:/usr/local/nginx/sbin/echoexport PATH$PATH:/usr/local/nginx/sbin/~/.bashrcNginx 常用命令命令作用nginx启动服务nginx -s quit优雅停止处理完当前请求后退出nginx -s stop强制停止直接 kill 进程nginx -s reload重新加载配置文件将 Nginx 注册为系统服务手写一个 systemd 服务文件让 Nginx 像系统自带服务一样管理# /etc/systemd/system/nginx.service [Unit] DescriptionNginx server daemon [Service] Typeforking ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload/usr/local/nginx/sbin/nginx -s reload ExecStop/usr/local/nginx/sbin/nginx -s quit [Install] WantedBymulti-user.targetsystemctl daemon-reload systemctlenablenginx.service--now# 开机启动 立即运行1.2 源码安装 Cmatrix —— 打造黑客帝国同款屏幕 Cmatrix 是一款 Linux 环境下炫酷的屏保软件效果类似于《黑客帝国》电影中的代码雨。项目地址github.com/abishekvashok/cmatrix安装步骤# 安装依赖yum-yinstallgccmakeautoconf ncurses-devel# 下载 解压wgethttp://192.168.50.200/class/course-materials/softwares/stage01/cmatrix-1.2.tar.gztar-xfcmatrix-1.2.tar.gzcdcmatrix-1.2/# 配置 → 编译 → 安装./configure--prefix/usr/local/cmatrixmakemakeinstall# 配置环境变量exportPATH$PATH:/usr/local/cmatrix/bin 运行效果# 基础运行cmatrix# 加粗红色代码雨速度设为 3cmatrix-b-u3-Cred参数含义-b加粗字体-u 0-10滚动速度默认 4-C color字体颜色green / red / blue / white / yellow / cyan / magenta / black-s屏保模式按任意键退出-a异步滚动 运行时骚操作无需重启就能随时改变颜色按键盘上的对应键位即可颜色按键对应数字键 红色!Shift1 绿色Shift2 黄色#Shift3 蓝色$Shift4 洋红色%Shift5 青色^Shift6⚪ 白色Shift7⚫ 黑色)Shift8按数字键0~9还能随时调整滚动速度2. 自建 YUM 仓库当内网环境无法访问公网仓库或者需要统一管理团队内部的软件包版本时自建 YUM 仓库就是你的救星。自建仓库四步走准备软件包 → 创建仓库索引 → 发布仓库 → 客户端配置Step 1准备软件包mkdirrpmscdrpms# 使用 --downloadonly 只下载不安装保留依赖包yuminstall--downloadonly--downloaddir.vimopen-vm-tools vsftpd\lrzsz bash-completion nginx httpd mariadb-server# 移动到 Nginx 发布目录mkdir/usr/local/nginx/html/toolsmvrpms /usr/local/nginx/html/tools/PackagesStep 2创建仓库索引yuminstall-ycreaterepo createrepo /usr/local/nginx/html/tools/️createrepo会扫描 Packages 目录生成repodata/索引文件YUM 客户端就是靠它找到软件包的。Step 3通过 Nginx 发布在 Nginx 配置中启用目录浏览# /usr/local/nginx/conf/nginx.conf http { autoindex on; # ← 开启文件清单功能方便浏览器查看 ... }systemctl reload nginxStep 4客户端配置# 备份原仓库mkdir/etc/yum.repos.d/oldmv/etc/yum.repos.d/*repo /etc/yum.repos.d/old# 创建新仓库配置catEOF/etc/yum.repos.d/tools.repo[tools] namecentos7 tools from server.laoma.cloud baseurlhttp://server.laoma.cloud/tools/ enabled1 gpgcheck0 EOF# 测试安装yuminstall-yhttpd 同步仓库把远程仓库搬回家reposync--repoidtools# 同步所有 RPM 包createrepo tools# 重建本地索引3. 计划任务管理Linux 中的计划任务分为两类一次性任务和周期性任务。掌握它们运维自动化就迈出了一大步。3.1 一次性计划任务at “下午 5 点把这份日志发邮件给老板” —— 这种只做一次的事交给at。at 依赖atd后台服务运行yuminstallat systemctl status atd# 确认 active (running)基本用法# 5 分钟后执行at now 5 minutes atechohello world/tmp/hello.log atEOT# ← 按 CtrlD 完成输入# 从脚本文件读取命令at now 5 minutesmyscript.sh at now 100 minutes-fmyscript.sh时间表达大全timespec表达式含义now 5 minutes5 分钟后now 5 hours5 小时后teatime tomorrow明天下午 4 点 (teatime 16:00)noon 4 days4 天后的中午 (noon 12:00)5pm august 3 20262026 年 8 月 3 日下午 5 点 完整时间表达参考/usr/share/doc/at/timespec任务管理命令命令作用atq或at -l查看任务队列at -c job号查看任务详细内容atrm job号或at -d删除任务at -q 字母指定队列 (a~z越靠后优先级越低)权限控制# /etc/at.allow 存在 → 只有文件中的用户能用 at# /etc/at.allow 不存在 → /etc/at.deny 中的用户被禁止# 两个文件都不存在 → 只有 root 能用 at3.2 用户周期性计划任务crontab “每周一早上 9 点生成周报” —— 这种重复执行的活交给crontab。依赖crond服务运行使用crontab命令管理。crontab 语法速查* * * * * command │ │ │ │ │ │ │ │ │ │ │ └── 要执行的命令 │ │ │ │ └─────── 星期几 (0-7, 0和7都表示周日) │ │ │ └──────────── 月份 (1-12) │ │ └───────────────── 几号 (1-31) │ └────────────────────── 小时 (0-23) └─────────────────────────── 分钟 (0-59)时间字段规则符号含义示例*每…* * * * *→ 每分钟x-y范围1-5→ 1 到 5x,y列表1,3,5→ 第 1、3、5*/x每隔 x*/5→ 每隔 5分钟/小时等实战示例# 每年 2 月 2 日上午 9 点运行备份0922* /usr/local/bin/yearly_backup# 7 月每周五 9:00-16:00每 5 分钟响一声*/59-16 * Jul5echoChime# 每个工作日周一至周五23:58 运行日报5823* *1-5 /usr/local/bin/daily_reportcrontab 常用命令命令作用crontab -l查看当前用户的计划任务crontab -e编辑计划任务默认 vicrontab -r删除所有计划任务crontab -u user -eroot 管理其他用户的任务crontab filename从文件导入任务替换现有任务 综合练习编写一个定时监控脚本需求让一个程序运行 20 秒后自动终止在 11 月份的奇数日 11:00-18:00每 2 分钟执行一次。# 1. 编写脚本 /usr/local/bin/myjob#!/bin/bashmd5sum /dev/zero# 后台启动会吃满 CPUsleep20# 等 20 秒pkillmd5sum# 干掉它chmodx /usr/local/bin/myjob# 2. 配置 crontab# */2 11-18 */2 11 *# 解读11 月奇数日11-18 点之间每 2 分钟执行crontab-e*/211-18 */211* /usr/local/bin/myjob 验证方法journalctl -f监控 cron 日志top观察 md5sum 出现又消失。3.3 系统级周期性计划任务系统管理员通过配置文件定义系统级任务crond 从三个地方读取配置文件用途/etc/crontab系统主配置文件比用户 crontab 多一个 “执行用户” 字段/etc/cron.d/第三方应用存放任务的推荐位置不会被更新覆盖/etc/anacrontab定义每日/每周/每月任务保证即使关机也能补执行# /etc/crontab 格式多一个 user-name 字段* * * * * user-namecommand# 示例每小时执行一次 cron.hourly 下的所有脚本01 * * * * root run-parts /etc/cron.hourlyanacron错过不怕醒了就补period(days) delay(min) job-id command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly monthly 45 cron.monthly nice run-parts /etc/cron.monthlyRANDOM_DELAY45会给任务加随机延迟最多 45 分钟防止所有机器同时执行造成负载尖峰。START_HOURS_RANGE3-22限定任务在凌晨 3 点到晚上 10 点之间运行。4. 进程调度管理 操作系统里运行的进程永远比 CPU 核心数多那 Linux 是怎么做到看起来同时运行的答案是——进程调度器。4.1 两类调度器┌────────────────────────────┐ │ Linux 进程调度器 │ └───────────┬────────────────┘ │ ┌───────────────┴───────────────┐ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ 实时调度器 │ │ 非实时调度器 │ │ (抢占力强) │ │ (抢占力弱) │ └──────┬──────┘ └──────┬──────┘ │ │ ┌─────┴─────┐ ┌─────────┼─────────┐ ▼ ▼ ▼ ▼ ▼ SCHED_RR SCHED_FIFO SCHED_NORMAL SCHED_BATCH SCHED_IDLE (轮询) (先入先出) (标准分时) (批处理) (极低优先级)关键结论⚡优先级最低的实时进程 优先级最高的非实时进程实时调度器进程优先级1 ~ 99非实时调度器 nice 值-20最高 ~ 19最低实时调度器安全阀为防止实时进程霸占所有 CPU导致 SSH 都连不上内核有两个保护参数# kernel.sched_rt_period_us 1000000 (1秒CPU分配周期)# kernel.sched_rt_runtime_us 950000 (0.95秒实时进程能用的上限)# → 剩余 0.05 秒留给非实时进程保证系统可响应4.2 管理进程优先级nice renicenice 值规则nice -20 ←──── 优先级最高抢 CPU 最猛 ... nice 0 ←──── 默认值 ... nice 19 ←──── 优先级最低最佛系没有 CPU 资源竞争时nice 值再高的进程也能拿到足够 CPU。只有资源紧张时nice 值才起决定性作用。nice命令启动时设置优先级# 默认 nice 值为 10nicemd5sum /dev/zero# 指定 nice 值nice-n5md5sum /dev/zero# ⛔ 普通用户只能设置正数 nice 值降低自己的优先级nice-n-5md5sum /dev/zero# 报错Permission denied# ✅ root 可以设置任意 nice 值nice-n-10md5sum /dev/zerorenice命令运行时修改优先级# 查看进程 PID 和 nice 值ps-opid,nice,command# 调整 nice 值renice-n555782# 55782 是进程 PID# ⛔ 普通用户只能升高 nice 值降低优先级不能降低renice-n-255782# 普通用户Permission deniedrenice-n-255782# root 用户成功在top中操作在top界面按r键 → 输入 PID → 输入新 nice 值即可动态调整4.3 实时调度策略chrtchrt是操作实时进程调度的利器# 查看各调度策略的优先级范围chrt-m# SCHED_OTHER min/max: 0/0 ← 非实时用 nice 值# SCHED_FIFO min/max: 1/99 ← 实时# SCHED_RR min/max: 1/99 ← 实时# SCHED_BATCH min/max: 0/0# SCHED_IDLE min/max: 0/0# 以 SCHED_RR 策略、优先级 5 启动进程chrt-r5md5sum /dev/zero# 查看进程的调度策略和实时优先级ps-opid,cls,rtprio,command# PID CLS RTPRIO COMMAND# 56225 RR 5 md5sum /dev/zero# 修改为 SCHED_FIFO、优先级 10chrt-f--pid1056225# 改回非实时调度chrt-o--pid0562255. 文件系统基本管理5.1 识别设备和文件系统Linux 中一切皆文件存储设备也不例外接口类型设备名示例SATA/SAS/USB/dev/sda,/dev/sdb虚拟磁盘 (virtio)/dev/vda,/dev/vdbNVMe SSD/dev/nvme0n1,/dev/nvme1n1SD/MMC/dev/mmcblk0,/dev/mmcblk1分区命名规则SATA/dev/sda1,/dev/sda2NVMe/dev/nvme0n1p1,/dev/nvme0n1p2虚拟磁盘/dev/vda1,/dev/vda2三大查看命令命令用途lsblk查看块设备结构树磁盘 → 分区 → LVM → 挂载点df -hT查看文件系统使用情况容量、已用、类型du -sh dir查看目录占用磁盘空间 实战揪出占用磁盘的胖子文件# 问题根分区快满了是谁干的# 方法一逐层排查du-sk/*|sort-n# 看根目录下谁最大 → /usr 最大du-sk/usr/*|sort-n# → /usr/share 最大du-sk/usr/share/*|sort-n# → /usr/share/doc 最大# ... 层层递进最终定位到罪魁祸首# 方法二一步到位查找 100M 的文件find/-size100M2/dev/nullLinux 哲学用各种小工具的灵活组合解决复杂问题而不是一个巨型程序包办一切。5.2 挂载和卸载文件系统挂载mount# 查看设备 UUIDblkid /dev/sdb# 三种挂载方式效果一样mount/dev/sdb /datamountUUIDf20547b2-df53-46e5-b526-a8744be26231/data# 验证df-h/data卸载umountumount/dev/sdb# 按设备卸载umount/data# 按挂载点卸载 “target is busy” 怎么办# umount 提示设备忙说明有进程正在用这个目录# 方法一lsof 查找占用进程lsof/data# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME# bash 1508 root cwd DIR 8,17 156 64 /data# 方法二fuser 查找占用进程fuser-m/data# /data: 1508c ← PID 1508c 表示当前目录在此# 退出目录后重新卸载cd~umount/data5.3 查找文件locate vs find特性locatefind速度⚡ 极快查数据库 实时扫描实时性❌ 依赖 updatedb 更新✅ 实时权限控制只显示用户有权限的需读取和执行权限适用场景按文件名模糊搜索复杂条件组合搜索locate 速查yuminstall-ymlocate updatedb# 先更新数据库locatepasswd# 模糊搜索locate-bpasswd# 只匹配文件名不含路径locate-ipasswd# 忽略大小写locate-cpasswd# 只显示计数locate-rhttp.*conf# 正则匹配find 完全指南find[路径][条件][动作]常用条件条件示例说明-name-name *.log按文件名区分大小写-iname-iname passwd按文件名忽略大小写-type-type d/-type f按类型目录/文件-user/-group-user laoma按属主/属组-perm-perm 764/-perm -4000按权限- 至少满足/ 任意满足-size-size 100M按大小 大于- 小于-mtime-mtime -7按修改时间-7 7天内条件组合# 逻辑与默认find.-name*.log-size1M# .log 文件 且 1M# 逻辑或find/-nouser-o-nogroup# 无属主 或 无属组# 逻辑非find/!-size-200M# 不小于 200M即 ≥200M常用动作# 直接删除find/-name*.tmp-delete# 详细列表find/etc-name*.conf-ls# 对找到的文件执行命令{} 代表找到的文件\; 表示命令结束find/-name*.log-execgzip{}\;# 批量复制find/-inum67160130-execcp-a{}./findfiles\; 今日总结今天的学习覆盖了 Linux 系统管理的四大核心领域┌─────────────────────────────────────────────────────┐ │ Linux 系统管理进阶 │ ├───────────────┬───────────────┬──────────────────────┤ │ 软件管理 │ ⏰ 任务调度 │ ⚙️ 系统底层 │ │ │ │ │ │ • 源码编译安装 │ • at 一次性 │ • 进程调度策略 │ │ • 自建YUM仓库 │ • crontab 周期│ • nice/renice 优先级 │ │ │ • 系统级任务 │ • chrt 实时调度 │ │ │ │ • 文件系统挂载/查找 │ └───────────────┴───────────────┴──────────────────────┘从能用到会用再到精通每一条命令背后都是对系统运行原理的理解。Keep Learning, Keep Hacking!

本月热点