【infra之路】Linux基础命令与系统排查

第一组:在文件系统里移动和查看

先认路。打开 WSL,逐条敲下面的命令,每敲一条都看看输出:

bash 复制代码
pwd                  # 我现在在哪个目录(print working directory)
ls                   # 列出当前目录的内容
ls -l                # 详细列表:权限、大小、修改时间
ls -la               # 加上隐藏文件(以 . 开头的)
ls -lh               # 大小用人类可读单位(K/M/G 而不是字节)
cd /                 # 跳到根目录
ls                   # 看看 Linux 的顶层目录结构
cd ~                 # 回到你的家目录(~ 是 home 的简写)
cd -                 # 回到上一个待过的目录

重点理解 :ls -l 输出的第一列像 drwxr-xr-x,开头的 d 表示这是目录(- 表示普通文件),后面九个字符是权限(读 r / 写 w / 执行 x),分给 所有者/组/其他人 三组。这个你现在有个印象就行,后面讲权限再细说。


第二组:创建、移动、删除

bash 复制代码
mkdir practice          # 建一个目录
cd practice
touch a.txt             # 建一个空文件
echo "hello infra" > note.txt   # 把文字写进文件(> 是覆盖写入)
echo "second line" >> note.txt  # >> 是追加写入,不覆盖
cat note.txt            # 打印文件全部内容
cp note.txt note2.txt   # 复制
mv note2.txt renamed.txt # 移动 / 重命名(同一个命令)
ls -l                   # 看看现在有哪些文件
rm a.txt                # 删除文件

一个必须现在就建立的安全意识 :Linux 的 rm 没有回收站,删了就是真没了。尤其 rm -rf 配合通配符极其危险。现在只用 rm 文件名 删具体文件,不要急着用 rm -rf


第三组:查看文件内容(几个高频工具)

先造一个多行文件来练:

bash 复制代码
seq 1 100 > numbers.txt   # 生成 1 到 100 每行一个数字,写入文件
cat numbers.txt           # 全部打印(文件大时会刷屏)
head numbers.txt          # 只看前 10 行
head -n 3 numbers.txt     # 只看前 3 行
tail numbers.txt          # 只看后 10 行
tail -n 5 numbers.txt     # 后 5 行
less numbers.txt          # 分页查看(按 空格 翻页,按 q 退出)
wc -l numbers.txt         # 数文件有多少行(line count)

tail 还有个杀手锏 tail -f,实时跟踪文件新增内容------后面你看训练日志、容器日志全靠它,先记个名字。


第四组:管道与重定向

核心概念 :管道符 | 把前一个命令的输出,直接喂给后一个命令当输入。这样小工具就能组合成强大的处理链。

先理解输入输出的去向:

bash 复制代码
echo "hello" > out.txt      # > 把输出重定向到文件(覆盖)
echo "world" >> out.txt     # >> 追加
cat out.txt | wc -l         # cat 的输出通过管道喂给 wc,数行数

cat out.txt | wc -l 这条要细品:cat 把文件内容吐出来,| 把这些内容传给 wc -l,后者数了有几行。cat 自己不数行,wc 自己不读文件,但管道让它们协作。

再用之前的 numbers.txt 练几个组合:

bash 复制代码
cat numbers.txt | head -n 20 | tail -n 5   # 取前20行里的后5行 = 第16-20行
seq 1 1000 | wc -l                          # 不落地文件,直接数 seq 生成了多少行
ls -l /etc | wc -l                          # /etc 目录里有多少个条目

最后一条很实用:你不用先把 ls 结果存文件再数,直接管道接 wc 就行。这种"边产生边处理"的思路贯穿整个命令行。

第五组:grep ------ 按内容查找

grep 是从文本里捞出匹配的行,你以后从几万行日志里找报错全靠它。

bash 复制代码
seq 1 100 > numbers.txt
grep "5" numbers.txt        # 找出所有含 "5" 的行(5,15,25,50,51...)
grep "5" numbers.txt | wc -l # 数一下有多少行含5
grep -c "5" numbers.txt     # grep 自带计数,-c 直接给数量
grep -v "5" numbers.txt     # -v 反向:输出不含5的行
grep -n "5" numbers.txt     # -n 显示行号

再练个更真实的场景------从系统文件里查东西:

bash 复制代码
grep -i "model" /proc/cpuinfo   # -i 忽略大小写,看你的CPU型号
cat /proc/meminfo | grep -i "memtotal"   # 管道 + grep 看总内存

grep 配合管道是排查问题的黄金组合。比如以后训练崩了,你会敲类似 cat train.log | grep -i error 一秒定位报错行。

第六组:awk 和 sort ------ 按列处理和排序

很多命令的输出是按列排的(像表格),awk 能精准取出某一列。

bash 复制代码
ls -l                       # 先看输出,它是多列的
ls -l | awk '{print $5, $9}'  # 取第5列(大小)和第9列(文件名)

awk '{print $5}' 的意思是:对每一行,按空格切成若干字段,打印第 5 个。$0 是整行,$1 是第一列,以此类推。这是你从结构化输出里提数据的利器。

sort 排序,uniq 去重,常和 grep/awk 串在一起:

bash 复制代码
seq 1 20 | sort               # 默认按字符串排序(注意:10会排在2前面)
seq 1 20 | sort -n            # -n 按数值排序,这才是1,2,...,10,11
seq 1 20 | sort -rn           # -r 倒序

一个经典组合,数每个值出现几次:

bash 复制代码
echo -e "apple\nbanana\napple\ncherry\nbanana\napple" > fruits.txt
cat fruits.txt | sort | uniq -c            # uniq -c 统计每行出现次数(需先sort)
cat fruits.txt | sort | uniq -c | sort -rn # 再按次数倒序 = 出现最多的在最上面

最后这条 sort | uniq -c | sort -rn 是命令行里的经典套路,以后你想统计"日志里哪种错误最多""哪个 IP 访问最频繁",就是这个模式。多敲几遍体会它。


好,这是模块一的收尾------进程管理 + 写第一个真正有用的脚本。学完这组,你就把前面所有零散命令串成了一个能交付的小工具。

第七组:进程管理

核心概念:每个运行的程序都是一个进程,有唯一的 PID(进程号)。你以后排查"训练卡住了""GPU 被谁占着""容器里什么在跑",全靠看进程。

bash 复制代码
ps aux                      # 列出所有进程(a=所有用户 u=详细 x=含无终端的)
ps aux | head -n 5          # 太多了,先看前5行理解列的含义
ps aux | grep bash          # 用管道+grep 找特定进程

ps aux 的列里你现在要认识的:PID(进程号)、%CPU%MEM(吃了多少内存)、最后的 COMMAND(具体在跑什么命令)。以后 nvidia-smi 显示 GPU 被占用却不知道是谁,你就用类似思路按 PID 反查。

实时监控top(或更好看的 htop):

bash 复制代码
top                         # 实时进程监控,按 q 退出
# 如果没装 htop,先装一个(WSL 里):
sudo apt update && sudo apt install -y htop
htop                        # 彩色、可交互,按 q 退出

htop 你以后会天天开着看 CPU/内存。先进去按 q 退出就行,熟悉界面即可。

后台运行与终止进程:

bash 复制代码
sleep 300 &                 # & 让命令在后台跑(这个假装跑了个300秒的任务)
jobs                        # 看后台任务
ps aux | grep sleep         # 找到它的 PID(看输出第二列的数字)
kill <那个PID>              # 把它终止掉(把<那个PID>换成真实数字)

& 后台运行、kill 终止进程,是你以后管理长时间训练任务的基本操作。

第八组:写第一个 shell 脚本

现在把零散命令固化成一个可重复运行的文件。脚本本质就是"把你会敲的命令按顺序写进文件,让机器替你敲"。

先建文件。用 nano(最简单的编辑器):

bash 复制代码
nano hello.sh

在打开的编辑器里输入下面内容:

bash 复制代码
#!/bin/bash
# 上面这行叫 shebang,告诉系统用 bash 来执行这个文件

echo "脚本开始运行"
echo "当前时间:$(date)"          # $(命令) 会把命令的输出嵌进来
echo "我在这个目录:$(pwd)"
echo "这个目录有 $(ls | wc -l) 个文件"
echo "脚本结束"

Ctrl+O 然后回车保存,Ctrl+X 退出。然后:

bash 复制代码
chmod +x hello.sh           # 给文件加上"可执行"权限(还记得第一组讲的 x 吗)
./hello.sh                  # 运行它(./ 表示运行当前目录下的这个文件)

几个要理解的点 :#!/bin/bash 必须在第一行,告诉系统用什么解释器;$(date) 这种 $(...) 语法会先执行里面的命令、再把结果填进来;chmod +x 不加的话文件没有执行权限,直接跑会被拒绝------这正好印证了第一组讲的权限概念。

第九组:综合实战 ------ 你的 nvidia-smi 监控脚本

这就是阶段一开头预告的练手任务。现在你具备所有零件了,我们把它拼起来。

先确认 WSL 里能跑 nvidia-smi:

bash 复制代码
nvidia-smi                  # 能看到你的 5060Ti 就继续;报错就先告诉我

能跑的话,看一个有用的查询方式------只取关键数字而不是一大屏:

bash 复制代码
nvidia-smi --query-gpu=timestamp,memory.used,memory.total,utilization.gpu --format=csv,noheader

这条直接吐出"时间,已用显存,总显存,GPU利用率",干净得正好能写进日志。现在写监控脚本:

bash 复制代码
nano gpu_monitor.sh

内容:

bash 复制代码
#!/bin/bash
# 每隔几秒记录一次 GPU 状态到日志文件

LOGFILE="gpu_usage.log"       # 变量:日志文件名
INTERVAL=2                    # 变量:间隔秒数

echo "开始监控,日志写入 $LOGFILE,按 Ctrl+C 停止"

while true                    # 无限循环
do
    # 取出 GPU 数据,前面加上当前时间,追加进日志
    STATS=$(nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu --format=csv,noheader)
    echo "$(date '+%H:%M:%S'), $STATS" >> "$LOGFILE"
    sleep $INTERVAL           # 等待指定秒数
done

保存退出后运行:

bash 复制代码
chmod +x gpu_monitor.sh
./gpu_monitor.sh            # 开始跑,会持续写日志

让它跑着,另开一个 WSL 窗口 ,实时看日志在增长------还记得我说过的 tail -f 吗,现在用上了:

bash 复制代码
tail -f gpu_usage.log       # 实时跟踪日志新增,按 Ctrl+C 退出

回到第一个窗口按 Ctrl+C 停止监控。然后用前面学的工具分析你刚记录的数据:

bash 复制代码
cat gpu_usage.log | wc -l              # 一共记了多少条
tail -n 5 gpu_usage.log                # 看最后5条
cat gpu_usage.log | awk -F',' '{print $2}'  # -F',' 用逗号分列,取第2列(已用显存)

这个脚本把模块一几乎所有东西都用上了 :变量、循环、$(...) 命令替换、重定向 >>datesleeptail -fawk 分列。它还是个真有用的工具------以后你跑训练或推理时,就靠这类脚本盯着显存有没有爆。

总结

下面是给你的命令速查,把这九组归整成一张能随时回看的表------以后忘了某个命令翻这里就行。

这张表你随时可以回来翻。模块一你真正掌握的不是这些命令的拼写------那些忘了查就行------而是两个更重要的东西:管道的组合思维 (小工具串起来解决大问题),以及带着任务去用、而不是干背的学习方式。这两点会一直跟着你到后面所有模块。

相关推荐
zh路西法1 小时前
【Linux 串口通信】基于 C++ 多线程的同步/异步串口实现
linux·运维·c++·python
c238561 小时前
linux基础2
linux·运维·服务器
子兮曰1 小时前
WSL 配 GPU 用 Docker 的折腾指南(2026 年版)
linux·前端·后端
vortex52 小时前
Linux 默认 SUID 可执行文件详解
linux·运维
2023自学中2 小时前
Linux虚拟机 CMakeLists.txt:x86 与 ARM 双架构编译脚本
linux·c语言·c++·嵌入式
土星云SaturnCloud2 小时前
从云端到边缘:基于土星云SE110S的智能视频分析轻量化部署方案(上)
服务器·人工智能·ai·边缘计算
阿狸猿2 小时前
论负载均衡技术在 Web 系统中的应用
运维·前端·负载均衡
Adorable老犀牛2 小时前
靠Claude Code写了登录助手AuthDash:一键自动登录,每天节省10分钟——这才是AI编程的降本增效
运维·ai编程·claudecode
爱就是恒久忍耐2 小时前
老Ubuntu安装podman 5.x版本
linux·ubuntu·podman