2026/10/24 5:23:46

【FDE系列】阶段2:Day 37:权限、进程与文本三剑客

【FDE系列】阶段2:Day 37:权限、进程与文本三剑客 前言FDE系列内容总纲【大纲】FDE 前沿部署工程师学习系列教程-CSDN博客前置课程列表见文档结尾附录。阶段2·Day 37权限、进程与文本三剑客FDE 学习系列教程 · 第二阶段 · 第 4 周 · Day 2预计时长3 小时 | 难度★★★☆☆ | 前置知识Day 36 文件操作命令一句话目标看懂rwx权限并用 chmod/chown 解决 Permission denied掌握 ps/top/kill 管理进程用 grep/awk/sed 管道在日志里精准排查问题。‍‍ 开场三个让新手崩溃的瞬间在 Linux 里待上半天你大概率会撞上这三堵墙写了个脚本./backup.sh想运行系统冷冰冰回你Permission denied权限被拒绝服务卡死了占着端口不放你不知道怎么找到它、弄死它客户说凌晨系统报过错甩给你一个500MB 的日志文件用眼睛翻翻到天亮今天就把这三堵墙一起拆了权限让你知道谁能动什么进程管理让你掌控正在运行的程序文本三剑客grep/awk/sed 管道让你在日志大海里一针见血。这三样是 FDE 现场使用频率最高的命令行技能没有之一。 一、权限rwx这串符号到底在说啥先建个文件然后用ls -l看它的身份证cd ~/fde_lab touch hello.sh ls -l hello.sh你会看到类似这样一行-rw-r--r-- 1 fde fde 0 Sep 18 10:00 hello.sh └────┬───┘ └┬┘ └┬┘ │ │ └── 所属组group │ └────── 所有者owner/user └──────────────── 权限位10 个字符今天的主角把权限位 10 个字符拆开位置 1 2 3 4 5 6 7 8 9 10 ┌─┐ ┌─────┐ ┌─────┐ ┌─────┐ │-│ │ r w -│ │ r - -│ │ r - -│ └┬┘ └──┬──┘ └──┬──┘ └──┬──┘ │ │ │ └─ 其他人other, o除了所有者和组成员 │ │ └────────── 所属组group, g同组的人 │ └─────────────────── 所有者user, u文件的主人 └─ 文件类型- 普通文件 / d 目录 / l 软链接快捷方式三个字母的含义字母英文对文件的含义对目录的含义容易忽略rread能看文件内容能列出目录里有什么lswwrite能改文件内容能在目录里增删文件xexecute能当程序运行能进入这个目录cd 目录的x权限特别反直觉它不是执行目录而是能不能 cd 进去、能不能访问里面的文件。所以一个目录你想正常使用通常得同时有r看里面有啥和x进得去。数字表示法r4, w2, x1这是新手最容易发怵的地方其实就一道小学加法题。每组权限是三个数字之和权限位 换算 数字 rwx → 421 → 7 读写执行全给 rw- → 420 → 6 能读能改不能跑 r-x → 401 → 5 能读能跑不能改 r-- → 400 → 4 只能看 --- → 000 → 0 啥也不能 三组数字拼一起所有者-组-其他人 755 rwxr-xr-x 主人全权其他人能读能跑脚本/程序标准配置 644 rw-r--r-- 主人能读写其他人只读普通文件/配置标准配置 600 rw------- 只有主人能读写密钥、.env 等敏感文件 777 rwxrwxrwx 谁都能为所欲为⚠️ 生产环境基本等于裸奔别用速记图 r w x 4 2 1 ┌────┬────┬────┐ u │ │ │ │ ← 所有者那组数字 ├────┼────┼────┤ g │ │ │ │ ← 组那组数字 ├────┼────┼────┤ o │ │ │ │ ← 其他人那组数字 └────┴────┴────┘ 7 5 5 这种三位数就是横着每组求和️ 二、chmod / chown改权限、改主人chmod修改权限两种写法都要会# 字母法给谁 /− 什么权限直观推荐新手用 chmod x hello.sh # 给所有人加执行权限ax 的省略写法 chmod ux hello.sh # 只给所有者加 x chmod g-w hello.sh # 去掉组的 w chmod o-r hello.sh # 去掉其他人的 r chmod urwx,grx,or-x hello.sh # 一次设三组逗号分隔不加空格 # 数字法一步到位老手最爱干净利落 chmod 755 hello.sh # rwxr-xr-x chmod 644 config.yml # rw-r--r-- chmod 600 .env # rw------- # 验证 ls -l hello.sh # -rwxr-xr-x 1 fde fde ... hello.sh ./hello.sh # 加了 x 就能直接这样运行了字母法符号速查谁u 所有者 / g 组 / o 其他人 / a 所有人(all默认) 操作 添加 / − 去掉 / 设成覆盖 什么r / w / x 例子chmod a-w file 所有人都不许写 chmod urwx,gorx file 主人 rwx其他人 rxchown修改所有者通常要 sudo# 格式chown 用户:组 文件 sudo chown fde:fde hello.sh # 主人改成 fde组改成 fde sudo chown -R fde:fde myproject/ # -R 递归整个目录连同里面的文件一起改 sudo chown fde hello.sh # 只改主人组不动Permission denied 急救手册以后再看到这行红字对号入座报错场景病因药方./script.sh: Permission denied脚本没有 x 权限chmod x script.sh改文件被拒文件不是你的sudo chown 你的用户名 文件cd进不去目录目录缺 xchmod x 目录装软件/改系统配置被拒需要管理员命令前加sudoSSH 连服务器提示密钥权限太开放密钥文件权限不能给别人看chmod 600 ~/.ssh/id_rsa⚠️别养成遇事不决 chmod 777的恶习。777 意味着任何用户都能改你的脚本/程序在客户服务器上是安全事故。正确做法是给该给的人精确授权。 三、进程管理找到它、看清它、干掉它进程Process就是正在运行的程序实例。同一个程序可以同时跑多个进程比如开两个终端窗口就是两个 bash 进程。ps查看进程快照# 看当前终端相关的进程信息少 ps # ⭐ 看系统所有进程aux 是最常用组合死记 ps aux # 配合 grep 找特定进程FDE 每日操作 ps aux | grep uvicorn ps aux | grep python ps aux | grep nginxps aux输出各列含义USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND fde 8421 0.5 1.2 123456 45672 ? Sl 10:00 0:08 uvicorn main:app └┬┘ └┬┘ └─┬─┘ └──┬──┘ │ │ │ └─ 具体命令 │ │ └─ 状态R运行 S睡眠 Z僵尸 │ └─ ⭐ PID进程编号杀进程全靠它 └─ 属于哪个用户ps aux | grep xxx会连 grep 自己也匹配出来因为 grep 进程的命令行里有 xxx。想排除干扰加一句ps aux | grep uvicorn | grep -v grep。top / htop实时监控top # 系统自带实时刷新 # 进入后 # P 按 CPU 排序 M 按内存排序 # k 输入 PID 杀进程 # q 退出 # 更好用的 htop彩色、可鼠标点、能滚动 sudo apt install -y htop htoptop 头部信息速看 load average: 0.15, 0.10, 0.08 ← 1/5/15分钟平均负载持续高于CPU核数忙 Mem: 8167MB total, 3200MB free ← 内存余量 %Cpu(s): 5.2 us ← CPU 占用kill终止进程先礼后兵# 先找到 PID ps aux | grep uvicorn # fde 8421 ... uvicorn main:app # ① kill PID发 SIGTERM 信号请你优雅退出 kill 8421 # 程序有机会保存数据、关闭连接后自行结束 # ② kill -9 PID发 SIGKILL 信号立刻枪毙没得商量 kill -9 8421 # 进程卡死、kill 没反应时才用可能丢失未保存数据 # ③ 按名字批量杀 killall uvicorn # 杀掉所有叫 uvicorn 的进程 pkill -f uvicorn # -f 匹配完整命令行更灵活kill 信号等级先礼后兵原则 kill PID SIGTERM(15) 礼貌劝退你自己收拾一下退出吧 ↓ 没反应 kill -9 PID SIGKILL(9) 就地正法内核直接回收无法拒绝 ⚠️ 跳过清理逻辑万不得已才用 标准操作顺序ps aux | grep找 PID → 先kill PID等几秒 → 还在再kill -9。先确认 PID 再杀杀错进程比如把数据库 kill -9 了后果很严重。端口被占了怎么办高频实战启动服务时报Address already in use说明端口被别的进程占了# 查 8000 端口被谁占需要 lsof 或 ss sudo apt install -y lsof sudo lsof -i :8000 # COMMAND PID USER FD TYPE DEVICE NODE NAME # uvicorn 8421 fde 8u IPv4 ... TCP *:8000 (LISTEN) kill 8421 # 找到 PID杀掉端口就释放了 # 或者用 ss系统通常自带 ss -tlnp | grep 8000lsof是什么一个 Linux 工具用来列出当前系统所有被打开的文件。在 Linux 里一切皆文件网络连接、端口、socket 也算打开的文件。所以它既能看文件被谁占用也能看端口被哪个进程占用——这正是我们需要的。命令参数说明sudo以管理员权限执行apt install安装软件包-y自动回答 yes无需手动确认lsof要安装的软件ListOpenFiles列出打开的文件lsof列出打开的文件-i只看网络相关的Internet 文件即网络连接/socket:8000限定端口 8000ss是 Linux 下用来查看网络连接和端口监听状态的现代工具用来替代老牌的netstat。ss -tlnp是它最常用的组合之一用来列出当前所有正在监听LISTEN的 TCP 端口并显示占用它们的进程。参数全称含义-tTCP只看TCP协议不显示 UDP-lListening只看处于监听状态的 socket即等待别人来连接的端口-nNumeric以数字显示端口和地址不做域名/服务名解析如显示:8000而不是:http-alt-pProcess显示占用该端口的进程PID 进程名连起来ss查看 TCP 协议、处于监听状态、用数字显示、并带进程信息。 四、管道与重定向Linux 命令的组合拳在学三剑客之前必须先掌握两个连接符它们是把简单命令组合成强大武器的关键。管道|前一个命令的输出喂给后一个命令命令 A 的输出 ──│管道│──► 当成命令 B 的输入 ps aux | grep uvicorn └──┬───┘ └────┬────┘ 列出所有进程 从里面筛出含 uvicorn 的行# 读日志 → 筛 ERROR → 数有几条 cat app.log | grep ERROR | wc -l # 列目录 → 按字典序排 → 只看前 10 个 ls /etc | sort | head -10 # 查进程 → 排除 grep 自身 ps aux | grep nginx | grep -v grep 管道可以无限接A | B | C | D数据像流水线一样依次流过每个命令。这是 Unix 设计哲学的精髓——每个命令只做好一件事靠管道组合出无限可能。重定向2把输出送进文件echo 启动时间$(date) run.log # 覆盖文件不存在就建存在就清空重写 echo 第二行 run.log # 追加在文件末尾接着写 cat run.log # 错误重定向明天部署会高频出现 uvicorn main:app app.log 21 # └─┬──┘ └─┬─┘ # │ └─ 21把错误输出(2)也并到标准输出(1)去的地方 # └─ 标准输出(1)写进 app.log # 效果正常日志和报错全进同一个文件三个标准流的编号了解一下不亏0 stdin 标准输入键盘 1 stdout 标准输出屏幕正常信息 2 stderr 标准错误屏幕报错信息 /dev/null 黑洞丢进去的东西直接消失如 2/dev/null 屏蔽报错 五、文本三剑客grep / awk / sed这三个工具各有所长一句话定位┌────────────────────────────────────────────────────────┐ │ grep 过滤器找行大海捞针只留匹配的行 │ │ awk 切割机取列/计算按列处理文本、做统计 │ │ sed 替换机改文本批量查找替换、行编辑 │ └────────────────────────────────────────────────────────┘先准备一份练习数据cd ~/fde_lab cat devices.csv EOF device_name,type,temperature,vibration,owner 注塑机A1,注塑,65,8,李工 注塑机A2,注塑,82,12,王工 注塑机A3,注塑,91,16,赵工 冲压机B1,冲压,75,9,李工 冲压机B2,冲压,88,6,陈工 EOF作用在 Shell 里创建或覆盖一个名为devices.csv的 CSV 文件并写入1 行表头 5 行设备数据。表示覆盖写入若文件已存在会被清空重写。 EOF是 Shell 的heredoc内联文档语法作用是把一段多行文本作为命令的标准输入。写成cat file EOF ... EOF时就是把EOF之间的内容原样写进文件。剑客一grep —— 过滤行# 基本用法输出包含关键词的行 grep 李工 devices.csv # 注塑机A1,注塑,65,8,李工 # 冲压机B1,冲压,75,9,李工 grep -i A1 devices.csv # -i 忽略大小写 grep -n 注塑 devices.csv # -n 显示行号 grep -c 李工 devices.csv # -c 只输出匹配行数 → 2 grep -v 李工 devices.csv # -v 反向输出【不含】关键词的行 grep -r TODO ~/fde_lab # -r 递归搜目录下所有文件 grep -E 李工|王工 devices.csv # -E 正则匹配李工或王工 grep 温度 devices.csv || echo 没找到 # 没匹配到时 grep 返回非0退出码grep 高频参数卡参数作用典型场景-i忽略大小写搜 error/Error/ERROR-n显示行号定位报错在日志第几行-c只数行数统计 ERROR 出现几次-v反向匹配排除 DEBUG 噪音行-r/-R递归搜目录全项目搜某个函数名-E支持扩展正则grep -E A|B或的关系-A N连带显示匹配行之后N 行看报错后面的堆栈-B N连带显示之前N 行看报错前发生了什么-o只输出匹配的部分从整行里抠出设备编号剑客二awk —— 按列处理awk 把每行文本按分隔符切成一列一列默认用空格切CSV 用-F,指定逗号$1 $2 $3表示第 1、2、3 列$0表示整行NR是行号/行数。# 取第 1 列和第 5 列设备名、负责人 awk -F, {print $1, $5} devices.csv # device_name owner # 注塑机A1 李工 # ... # 条件过滤第 3 列温度 80 的行打印设备名和温度 awk -F, $3 80 {print $1, $3} devices.csv # 注塑机A2 82 # 注塑机A3 91 # 冲压机B2 88 # 统计温度总和 / 行数 平均值 awk -F, NR1 {sum$3; count} END {print 平均温度:, sum/count} devices.csv # 平均温度: 80.2 # NR1 跳过表头sum 累加END{} 在所有行处理完后执行 # 给输出加个好看的格式 awk -F, NR1 {printf %-10s 温度:%s度 负责人:%s\n, $1, $3, $5} devices.csvawk 程序结构 awk -F分隔符 条件 {动作} 文件 │ └─ 对每行干什么print/累加/... └─ 满足条件的行才处理可省略所有行 特殊变量 $0 整行 $1~$N 第N列 NR 当前行号(总行数) NF 当前行列数 awk 是一门完整的小型编程语言不用学深。FDE 记住三招即可print $N取列、条件 {}过滤、sum$N累加统计。复杂的数据分析交给第 3 周学的 pandasawk 负责在服务器上快速看一眼。剑客三sed —— 批量替换# 替换预览不加 -i只在屏幕上显示结果文件不变 sed s/注塑/注射成型/g devices.csv # s substitute 替换g global 一行里全换不写 g 只换每行第一个 # ⭐ -i直接修改文件in-place真改重要文件先备份 sed -i s/冲压/冲压工艺/g devices.csv grep 冲压工艺 devices.csv # 确认改好了 # 实战批量改配置文件里的地址 sed -i s/localhost/192.168.1.50/g config.yml # 删除包含某关键词的行 sed -i /不要的内容/d devices.csv # 只打印第 2 到第 4 行-n 配合 p sed -n 2,4p devices.csv⚠️sed -i是直接改文件没有撤销键。操作客户的配置文件前先cp config.yml config.yml.bak留个后路或者先不加-i预览一遍效果。️ 六、综合实战在日志里排查一次故障把今天学的全串起来。这是 FDE 接到客户电话后的标准排障动作。第一步造一份真实感的日志cd ~/fde_lab cat app.log EOF 2026-09-18 09:00:00 [INFO] 服务启动监听 8000 端口 2026-09-18 09:01:23 [WARNING] 设备 A2 温度偏高: 82 2026-09-18 09:02:15 [ERROR] 设备 A3 通信超时 2026-09-18 09:03:00 [INFO] 触发自动重试机制 2026-09-18 09:03:05 [ERROR] 设备 A3 通信超时第2次 2026-09-18 09:05:00 [INFO] 定时巡检完成 2026-09-18 09:10:00 [ERROR] 数据库连接断开: timeout after 30s 2026-09-18 09:10:02 [INFO] 尝试重新连接数据库 2026-09-18 09:10:05 [INFO] 数据库重连成功 EOF第二步一套组合拳排查# ❶ 总览错误一共有几条 grep -c ERROR app.log # 3 # ❷ 看所有错误和警告排除 INFO 噪音 grep -E ERROR|WARNING app.log # ❸ ERROR 都出现在第几行 grep -n ERROR app.log # 3:... 5:... 7:... # ❹ 看第 7 行那条数据库错误的上下文前1行后2行 grep -n -B1 -A2 数据库连接断开 app.log # ❺ 从错误行里抠出涉及哪些设备 grep ERROR app.log | grep -oE 设备 [A-Z][0-9] # 设备 A3 # 设备 A3 # ❻ 统计每台设备出现几次错误awk 取设备列 sort 排序 uniq 计数 grep ERROR app.log | grep -oE 设备 [A-Z][0-9] | sort | uniq -c # 2 设备 A3 # ❼ 最后看一眼日志结尾确认系统恢复没有 tail -3 app.log # ❽ 真实场景服务还在跑实时盯着有没有新错误 tail -f app.log | grep --line-buffered ERROR # CtrlC 退出这套流程的排障思维客户系统好像 9 点多出问题了 │ ▼ tail -f / tail -100 ← 先看最新/结尾知道现在啥状态 │ ▼ grep -c ERROR ← 量化错误多不多 │ ▼ grep -n ERROR ← 定位第几行什么时间 │ ▼ grep -A/-B 上下文 ← 还原报错前后发生了什么 │ ▼ grep -oE awk ← 提取哪些设备/用户受影响 │ ▼ 定位根因 → 处理 → 再 tail -f 观察是否恢复 客户说系统挂了你 SSH 上去第一反应不是乱敲而是tail -fgrep ERROR。这两个命令的熟练度直接决定客户眼中你专不专业。 本课小结类别知识一句话记住权限rwx读/写/执行目录的 x 能进入权限u/g/o所有者/组/其他人权限数字法r4 w2 x1常用 755/644/600权限chmod改权限chmod x f.sh/chmod 755 f.sh权限chown改主人sudo chown -R user:group dir进程ps aux看所有进程配 grep 找 PID进程top/htop实时看 CPU/内存进程kill / kill -9礼貌劝退 / 就地正法端口lsof -i:端口查端口被谁占管道A | BA 的输出喂给 B重定向21覆盖写 / 追加 / 错误并入grep过滤行-i -n -c -v -E -A/-B/-oawk处理列-F, {print $1}NR1跳表头sed替换sed -i s/旧/新/g 文件 核心认知权限的本质是身份 × 动作——你是谁u/g/o决定你能干啥r/w/xPermission denied 永远从这两个维度排查。三剑客靠管道组队才厉害grep 负责找到行、awk 负责拆出列、sed 负责改掉字|让它们像流水线一样协作。 课后练习练习 1权限实操约 20 分钟新建secret.txt用chmod 600设成只有自己能读写ls -l验证显示-rw-------新建run.sh内容就一行echo ok先用字母法chmod ux加执行权限并运行再用数字法改成755运行思考题为什么.env文件建议用 600 而脚本用 755练习 2进程猎杀约 20 分钟在一个终端启动uvicorn main:app --port 8000在 ~/fde_project 里新开终端用ps aux | grep uvicorn找到它的 PID用sudo lsof -i :8000确认占用端口的就是它用kill PID优雅停止回到第一个终端观察服务退出的输出练习 3日志排查综合题约 30 分钟用本课的app.log完成数出 INFO、WARNING、ERROR 各有多少条提示分别grep -c列出所有含时间戳09:10的日志系统在那一分钟干了啥用 awk 统计跳过表头不算写出命令提取所有[ERROR]后面的错误描述用 sed 把日志里所有设备 A3替换成设备 DEVICE-A3先不加-i预览再-i真改进阶awk /ERROR/{print} app.log | wc -l和grep -c ERROR app.log结果一样吗为什么 下节预告单条命令再厉害也是你敲一下它动一下。明天学Shell 脚本——把一串命令写进文件加上变量、条件、循环、函数让它变成一个能判断、能复用的小程序。收官实战是写一个自动备份脚本传一个目录进去自动打包压缩、按日期命名、记录日志、报告大小。以后客户让你每天备份一下你就有现成的家伙事儿了。明天见附录前置课程列表阶段一认知启蒙AI 认知与 FDE 角色AI 认知【FDE系列】阶段1Day 1AI 层级关系 — 四个嵌套的圈-CSDN博客【FDE系列】阶段1Day 2AI 三阶段发展史 — 会认 → 会判断 → 会创造-CSDN博客【FDE系列】阶段1Day 3符号 AI vs 机器学习 — 两条路线的本质区别-CSDN博客【FDE系列】阶段1Day 4Transformer 的历史意义 — 2017 年的分水岭-CSDN博客【FDE系列】阶段1Day 5本周复习与自测 — 检验你的 AI 认知地基-CSDN博客【FDE系列】阶段1Day 6Transformer 架构 — 一张图纸盖出千千万万栋楼-CSDN博客【FDE系列】阶段1Day 7LLM 本质 — 文字接龙机器-CSDN博客【FDE系列】阶段1Day 8Token — 模型眼中的最小单位-CSDN博客【FDE系列】阶段1Day 9AI 幻觉 — 为什么会一本正经地胡说八道-CSDN博客【FDE系列】阶段1Day 10上下文窗口 — 模型的记忆力上限 本周复习-CSDN博客【FDE系列】阶段1Day 11Prompt — 给模型立规矩-CSDN博客【FDE系列】阶段1Day 12Memory — 让模型记住上下文【FDE系列】阶段1Day 13RAG — 给模型配图书管理员-CSDN博客【FDE系列】阶段1Day 14Tool Use — 让模型动手操作-CSDN博客【FDE系列】阶段1Day 15MCP — 统一的工具接口标准 第三周复习-CSDN博客FDE 基础概念【FDE系列】阶段1Day 16什么是 FDE — 把 AI 变成客户结果的人-CSDN博客【FDE系列】阶段1Day 17FDE vs 传统实施 — 三大本质区别-CSDN博客【FDE系列】阶段1Day 18FDE 三重身份 C6 胜任力模型-CSDN博客【FDE系列】阶段1Day 19七阶段行动路径 行业经验的价值-CSDN博客【FDE系列】阶段1Day 20阶段总结与产出物 — 第一阶段收官-CSDN博客阶段二技术地基Python FastAPI SQL Docker API 集成Python基础【FDE系列】阶段2Day 21Python 环境搭建 — 写出你的第一行代码-CSDN博客【FDE系列】阶段2Day 22变量、数据类型、条件判断 — Python 的“记忆“和“判断“-CSDN博客【FDE系列】阶段2Day 23循环与函数 — 让代码跑 100 遍、把逻辑打包复用-CSDN博客【FDE系列】阶段2Day 24数据结构 — 列表、字典、集合、元组-CSDN博客【FDE系列】阶段2Day 25文件读写与 JSON — 让程序连通外部数据第一周收官-CSDN博客【FDE系列】阶段2Day 26模块化编程 — 把代码拆成“抽屉柜“-CSDN博客【FDE系列】阶段2Day 27异常处理与日志 — 让程序“摔不烂、查得到“-CSDN博客FastAPI入门到进阶【FDE系列】阶段2Day 28FastAPI 入门 — 把你的函数变成 API 服务-CSDN博客【FDE系列】阶段2Day 29FastAPI 进阶 — Pydantic 模型与完整 CRUD 实战-CSDN博客【FDE系列】阶段2Day 30生产代码规范 — 测试、类型注解、配置管理第二周收官-CSDN博客SQL基础【FDE系列】阶段2Day 31SQL 基础 — 增删改查一把梭-CSDN博客【FDE系列】阶段2Day 32多表查询 — JOIN 与聚合-CSDN博客【FDE系列】阶段2Day 33进阶查询 — 窗口函数与 CTE-CSDN博客【FDE系列】阶段2Day 34数据清洗 — 把脏数据捋干净-CSDN博客【FDE系列】阶段2Day 35Python SQL — 工单接入 MySQL 本周收官-CSDN博客【FDE系列】阶段2Day 36Linux 入门与文件操作 — 扔掉鼠标的第一天-CSDN博客