刚看到这标题的时候我愣了一下,Liunx——好家伙,又见这个经典拼写。十多年里我在各种论坛和技术群里见到不下几百次,从刚入门的菜鸟到偶尔撸脚本的老手,总有人把Linux打成Liunx。说实话这不算什么大事儿,毕竟大家一看就知道说的是哪个系统,这也算是圈内一种心照不宣的默契了。
但真正让我觉得有必要写这篇笔记的原因,并不是纠结一个单词怎么拼,而是我观察到的一个现象:很多人学 Linux 的方式是背命令,今天背ls、明天背cd、后天背grep,背了仨月,真到了服务器上出问题,照样一头雾水。为什么?因为把命令当成孤立的"咒语"来记,只要场景一变,根本不知道怎么组合、怎么变通。
我早年在好几家互联网公司做过运维和研发,从零搭建过测试环境,也处理过不少线上事故。这些年用 Linux 的体感就是——它的知识结构其实比大多数人想象的要紧凑得多。文件、进程、权限、日志、网络,翻来覆去就那么几件事。今天这篇笔记,我就把这几件事拆开揉碎,结合真实的服务器运维场景来讲。你不懂 Linux 也能跟着走一遍,老手也能从中挑出一些值得反思的细节。
1. 整体设计与思路拆解:先建立认知地图,再谈具体命令
很多人学 Linux 一上来就是ls、cd、pwd,这没错,但问题在于没有先建立一张"地图"。Linux 系统的日常操作再怎么花里胡哨,本质上都绕不开下面五个维度:文件与存储、用户与权限、进程与资源、网络与连接、日志与排障。我见过的所有能把 Linux 玩明白的人,脑子里都有这张地图。拿到一个问题,先判断它是哪个维度的事,再顺着维度找命令找方案,就不会乱。
1.1 五维认知模型:Linux 日常操作的骨架
拿最常见的场景举例——"网站访问不了"。新手反应是到处试命令,老手的行为是:先看进程还在不在(ps),再看端口有没有监听(ss),接着看日志报什么错(tail),最后看磁盘和内存够不够(df、free)。看到没有?完全不靠背,就是按维度排查。
这里我给一个建议:把 Linux 学习分成两条线并行。第一条线是"场景线",比如"我要部署一个 Python 服务""我要给用户开放一个目录的上传权限""我要查一下为什么磁盘满了"。第二条线是"底层线",比如文件描述符是什么、硬链接和软链接有什么区别、crontab的环境变量为什么和你手动执行的不一样。两条线走到一半交汇,你的水平就起来了。
1.2 别急着上各种花哨工具:命令行核心就三板斧
现在很多新手被推荐学tmux、zsh、oh-my-zsh,这些确实能提升效率,但不是雪中送炭。真正雪中送炭的是三样东西:命令的组成结构、帮助系统、管道和重定向。这三个是一切的根基。
命令组成结构,说白了就是"命令 + 参数 + 选项"。很多人以为ls -l里的-l是"long"的意思,对,但不全对。搞清楚-和--的区别(短选项和长选项),再看ls和ls -l输出格式的不同,很多命令自然就会了。帮助系统方面,man和info是官方文档,--help是快捷参考,这三种要熟练切换。
管道和重定向是真的需要下功夫的。|是把前一个命令的输出交给下一个命令处理,>和>>是把输出写到文件里。我把这三样东西称为"命令行的语法基础",因为它们是把零散工具组合起来的粘合剂。
2. 核心细节解析与实操要点:文件、权限、进程三大重头戏
下面进入正题。选这三个维度来重点讲,是因为我接触的绝大多数 Linux 问题都集中在它们身上——文件找不到了、没权限改了、进程卡死了,这三句话基本能覆盖 80% 的新手求助。
2.1 文件操作不只是 ls 和 cd:看得见和看不见的文件
ls和cd是入门级,不用多讲,但有三个细节很多人用得少,关键时刻特别有用。
第一个是tree命令。系统默认不一定装,但装完之后看目录结构非常直观,加-L指定层级,比如tree -L 2只看两层,分析一个陌生项目的目录结构时比ls -R清晰得多。
第二个是find命令。很多人知道find / -name "xxx"是全局找文件,但不知道它还能按时间、大小、类型找。我举个实际场景:磁盘告警,日志目录快满了,要找出最近 7 天内改动超过 100M 的文件,可以用:
find /var/log -type f -mtime -7 -size +100M这条命令实际用到的次数远比按名字查找多。第三个是通配符。*和?的区别一定要弄清楚:*匹配任意数量字符,?只匹配一个字符。rm -rf *.log和rm -rf *.?og处理的范围完全不同。别小看这个,误删数据的事故,很多时候是通配符范围没搞清楚。
2.2 权限模型:rwx 和数字之间的关系
权限这一块必须彻底理解。Linux 权限九位字符,分三段:属主、属组、其他用户。每段三位,对应读r、写w、执行x。数字表示法是把r=4、w=2、x=1相加。为什么是 4、2、1?因为这是二进制位,4 是 100,2 是 010,1 是 001,每一位独立,加在一起不会混淆。chmod 755就是属主 7(rwx)、属组 5(r-x)、其他用户 5(r-x)。
这里我要特别强调两个在实战中容易忽略的点。第一个是目录的 x 权限到底意味着什么。文件的 x 是能否执行,目录的 x 是能否进入这个目录。如果只给了目录 r 权限但没有 x,你ls能看到目录里的文件名,但cd进不去,stat拿不到详细属性。这种半吊子权限经常在一些共享目录配置中出现,排查半天才发现是权限组合不对。第二个是为什么不要轻易chmod 777。777意味着所有人都能读写执行,相当于把家门钥匙复制了一万份贴满小区。开发环境里图省事用了777,到了生产环境忘了改,轻则被删配置,重则整个服务被拖垮。正确做法是给最小必要权限,文件就644、755,需要协作就搞组权限。
2.3 进程管理:搞清楚什么在跑、状态怎么样
进程这块,新手第一步是ps aux,但很多人看不懂输出。ps aux里每一列的含义:USER是哪个用户启动的,PID是进程号,CPU是占用 CPU 的百分比,MEM是占用内存的百分比,STAT是进程状态,COMMAND是实际执行的命令。STAT常看的几个状态码:S是睡眠,R是运行,Z是僵尸进程,T是停止。Z状态要警惕,僵尸进程杀不掉,只能处理它的父进程。
top命令是动态看资源占用,但很多运维老手其实更常用htop——彩色、支持鼠标操作、可以树状显示进程关系。没装的话apt install htop或者yum install htop装一下,让监控更直观。如果真的要看实例,我给过一个实际项目的例子:排查 Java 服务 CPU 飙高的问题,先用top定位到哪个 Java 进程占用高,再用top -Hp PID看具体哪个线程有问题,配合jstack导出线程快照,用printf "%x" 线程号转成十六进制去匹配,定位到具体代码行。这个排查思路学一次就能用一辈子,比到处问人"Java 进程 CPU 高怎么办"有用得多。
进程和资源这一块,我还想提一个几乎所有人都会踩的坑:kill -9用多了会出事。kill -9是强制终结进程,不给他机会做任何收尾工作——不写缓冲数据、不关闭文件、不通知子进程。我自己以前图省事,一卡就kill -9,结果几次数据库文件损坏,教训很深。正确姿势是先kill PID(发 SIGTERM,让进程自己处理退出逻辑),等几秒看它还不退再用kill -9。这和我们关电脑要先点关机、而不是直接拔电源是一个道理。
3. 实操过程与核心环节实现:从零到跑起一个服务的完整示例
光讲概念容易飘,我拿一个完整的实操例子把上面的东西串起来。假设我们要在一台干净的 CentOS 服务器上,把一个简单的 Python Web 服务部署起来。当然这里不会涉及生产级的上游负载、HTTPS 证书什么的,我们就专注把一条链路跑通,过程中很多知识点都会出现。
3.1 Step 1:系统摸底与初始连接
登录服务器后的第一件事不是着急装东西,而是先摸底。我会依次看下面几项:
- 系统版本:
cat /etc/os-release(有NAME和VERSION_ID两行,判断是 CentOS 7、8 还是 Ubuntu,包管理器完全不同) - 当前用户:
whoami和id(有没有 sudo 权限,是 root 还是普通用户) - 系统架构:
uname -m(一般都是x86_64,但要是 ARM 服务器,后面装软件包的思路就不一样了) - 磁盘情况:
df -h(先看看根分区够不够用,装软件之前发现磁盘满了是一件很尴尬的事)
这些不是形式主义,我接手过不少"前任"留下的服务器,系统版本不同,同样的命令效果完全不一样。CentOS 7 用yum,CentOS 8 之后推荐dnf,Ubuntu 系用apt,这些搞混了,装任何东西都会翻车。
3.2 Step 2:创建专用目录和用户
为了演示权限和文件操作,我建议创建一个专用用户,不要什么都用 root 跑。给一个规律:服务和项目能不用 root 就不用 root,出问题之后排查权限依赖会非常痛苦。
useradd -m -s /bin/bash deploy mkdir -p /data/www/myapp chown -R deploy:deploy /data/www/myappuseradd -m会顺手创建用户家目录,-s /bin/bash指定登录 shell。然后创建项目目录,并把目录属主改成deploy。这里我用了/data/www而不是/root或者/home,是我们的习惯——约定的服务数据目录统一放/data下,找起来方便,备份也好做。权限这块,chown -R deploy:deploy是"递归地改属主和属组"的意思,-R一定不能漏,不然目录建好了里面还是别人的,后续写文件照样报 permission denied。
3.3 Step 3:编写测试脚本并验证执行权限
先写一个最简单的 Python 脚本,内容就是启动一个 HTTP 服务。为了演示权限,我们先创建一个脚本文件:
#!/usr/bin/env python3 from http.server import HTTPServer, SimpleHTTPRequestHandler import os os.chdir('/data/www/myapp') HTTPServer(('0.0.0.0', 8080), SimpleHTTPRequestHandler).serve_forever()代码本身没什么高深的,关键是接下来的操作。保存为/data/www/myapp/server.py后,要执行它需要两个条件:一是文件有 x 权限,二是解释器/usr/bin/python3存在。我们先看一下文件权限:
ls -l /data/www/myapp/server.py # -rw-r--r-- 1 deploy deploy 192 Aug 15 10:30 server.py权限是644,没有执行权限。这时候直接./server.py会报 permission denied。给它加上执行权限有两种方式:
chmod +x /data/www/myapp/server.py # 或者 chmod 755 /data/www/myapp/server.py两种方式效果等价,chmod +x是追加执行位,chmod 755是直接指定最终权限。我更推荐第二种,因为显式指定目标状态比"在现有基础上增删"更可控,不容易出现"我加了 x 但 ugo 搞错了"的情况。
3.4 Step 4:启动服务、验证状态、查看日志
启动服务可以前台跑,也可以后台跑。先用前台跑方便观察输出,确认没问题再转后台:
cd /data/www/myapp ./server.py看到终端出现Serving HTTP on 0.0.0.0 port 8080说明服务起来了。另开一个终端验证:
curl -I http://127.0.0.1:8080/返回HTTP/1.0 200 OK就说明本地已经通了。再验证一下端口监听状态:
ss -ltnp | grep 8080ss是netstat的现代替代品,-l只显示监听中的端口,-t只看 TCP,-n不解析服务名直接显示端口号,-p显示对应进程信息。能在输出里看到python3和 PID 就说明监听正常。这时候把前台的进程Ctrl+C停掉,再用后台方式启动:
nohup ./server.py >> /data/www/myapp/server.log 2>&1 &nohup的意思是"不挂断",即使退出终端进程也不停。>>是追加输出到日志文件,2>&1是把标准错误也重定向到日志里。这个写法是跑后台任务的经典范式,值得刻进脑子里。
3.5 Step 5:模拟一次真实故障排查过程
服务跑着,但某天发现访问量上不去,先看一下进程状态:
ps aux | grep server.py如果发现进程根本没在,去翻日志:
tail -n 50 /data/www/myapp/server.log日志如果显示端口已被占用:
ss -ltnp | grep 8080 # 有另一个进程占用了端口处理方式是先确认占用的进程是什么,如果不是预期的就kill PID,然后再重启服务。如果磁盘满了也会导致服务起不来,别急着重启,先df -h,看看是不是/分区撑爆了。这个排查路径我称之为"进程→端口→日志→磁盘"四层检查法,大部分服务的启动失败都能通过这条路径定位。
3.6 常用命令速查表:日常操作一览
把上面涉及的以及日常用得最多的命令整理成一个速查表,按场景分类:
| 场景 | 命令示例 | 核心作用 |
|---|---|---|
| 目录导航 | cd - | 在最近两次目录之间跳转,我写脚本时频繁用,少打很多长路径 |
| 文件查找 | find /data -name "*.py" | 按文件名或后缀查找,配合-mtime、-size效果更好 |
| 查看文件 | head -n 20 file/tail -f file | 头尾查看,tail -f是实时跟踪日志的利器 |
| 文本处理 | grep -r "error" /var/log/ | 递归找关键词,-i忽略大小写常配着用 |
| 权限设置 | chmod 755 script.sh | 给脚本执行权限 |
| 属主调整 | chown -R deploy:deploy /data/www | 修改文件属主和属组,-R递归整个目录 |
| 进程查看 | ps aux/top -Hp PID | 静态/动态查看进程,后者看线程更专业 |
| 端口状态 | ss -ltnp | 查看监听端口和对应进程 |
| 日志跟踪 | journalctl -u nginx -f | systemd 托管服务日志,-f实时跟踪 |
| 资源占用 | free -h/df -h | 内存、磁盘一屏概览 |
这个表不用背,打印出来贴屏幕旁边,用一两周就自然熟了。
4. 文本处理与效率工具:grep、sed、awk 的实战逻辑
文件查找和服务器管理解决的是"东西在哪"的问题,但真正让 Linux 物超所值的是文本处理三兄弟:grep、sed、awk。这句话我经常对新人讲:在 Linux 上工作,一半时间在处理文本,另一半时间在处理文本产生的数据。日志、配置文件、命令输出,全是文本。
4.1 grep:不是只会 grep error 就行
grep的几个常用变体:grep是普通查找,egrep或grep -E支持扩展正则,grep -r递归目录查找,grep -i忽略大小写,grep -v反向匹配(排除某关键词)。但更实用的是组合用法,比如:
grep -E "ERROR|FATAL" /var/log/nginx/error.log | grep -v "favicon.ico"这条命令的意思是:找日志里的 ERROR 和 FATAL 行,但排除 favicon.ico 相关的。中间用管道连接,前一个grep的输出作为后一个的输入。这种管道链式处理方式,是 Linux 命令行最有魅力的地方——不用写脚本就能快速过滤、归并数据。实际项目里我还经常用量词,比如grep -E "^[0-9]{4}"匹配以四位数字开头的行,用于提取带年份的日志条目。
4.2 sed:流编辑器的三个核心场景
sed常被说成是"流编辑器",听着挺玄,用起来就三个高频场景:
一是替换文本。配置文件里把端口 8080 改成 9090:
sed -i 's/8080/9090/g' config.ini-i是直接改文件,s/旧/新/g是全局替换。没有-i的时候,sed 只把结果输出到终端,不改原文件,很多人第一次用都栽在这上面。二是删除行。删除配置文件里的注释行(以#开头):
sed -i '/^#/d' config.ini三是按范围提取内容。比如提取从[database]到[cache]之间的内容:
sed -n '/\[database\]/,/\[cache\]/p' config.ini-n配合p的意思是"不打印全部,只打印匹配范围内的行"。这三个场景覆盖了运维日常里 90% 的 sed 需求。
4.3 awk:默认按空格分列,比想象中简单
awk很多人一听就头疼,其实最常用的只有列提取。它的默认行为是按空格或 Tab 把一行拆成多列,然后$1、$2、$3分别代表第一、第二、第三列。最经典的是从df -h输出中提取磁盘使用率:
df -h | awk '{print $5}'输出每一行的第五列,也就是磁盘使用百分比列。再加一个过滤条件,只看使用率超过 80% 的分区:
df -h | awk '$5>80'df -h的表头Use%也会被一起打印出来,可以用NR>1跳过第一行(NR是行号):
df -h | awk 'NR>1 && $5>80 {print "磁盘快满了:", $1, $5}'这个组合实战价值极高。你以为这是编程?不是,这就是文本处理的思路。我再补充一个真实案例:日志分析时从 Nginx 日志里提取每分钟请求数,需要先取$4(时间字段),截取到分钟级别,然后排序计数:
awk '{print substr($4, 14, 5)}' access.log | sort | uniq -c | tail -n 20substr($4, 14, 5)是取第 4 列字符串从第 14 个字符开始的 5 个字符,刚好是09:45这种分钟格式。sort排序,uniq -c去重并计数,tail -n 20看最后 20 行。一条命令完成"排查哪个分钟请求量异常"的任务。
4.4 管道思维:一长串命令组合出魔法效果
最后一定要讲管道。管道是 Linux 命令行的灵魂,一台服务器上的日志几十 GB,你不可能下载下来用 Excel 打开,但你可以用管道一条命令顶别人手动排查半天。比如对访问日志按 IP 统计访问次数,取前 10 名:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -n 10这条命令的分解:先把第一列 IP 全部打出来,排序让相同 IP 相邻,uniq -c统计每个 IP 出现的次数,再按次数倒序排列,最后取前十条。每段都简单,组合起来就是一条非常有杀伤力的分析命令。这就是 Linux 命令行的范式:不做大型程序,而是像搭积木一样组合小工具。
5. 网络诊断与系统资源:从测试环境到线上问题
网络和资源这块,日常排障用到的高频命令其实不算多,但每个都要能用得准、用得对。我把它们分成两组:一组对外看连接(网络诊断),一组对内看资源(CPU、内存、磁盘)。
5.1 网络连通性:从 ping 到 curl
ping:测网络通不通,看网络延迟(time值)和丢包率。但ping不通不代表服务不可用,可能是对方防火墙禁了 ICMP,域名解析到别的 IP,或者端口没开。telnet(或nc):测特定端口是否可达。比如telnet 10.0.0.5 3306,能连上说明 MySQL 端口通,连不上大概率是防火墙挡了。nc -zv 10.0.0.5 3306也是常见写法,-z不发送数据只检测,-v显示详细过程。curl:测 HTTP 服务时最常用,-I只看响应头、-s静默不显示进度条、-w可以自定义输出格式。之前帮人排查接口超时,就是用curl -w "耗时: %{time_total}s\n" URL看的完整耗时和各阶段时间。ss:现代 Linux 中替代netstat查看端口和连接,连接状态有LISTEN(监听)、ESTABLISHED(已建立)、TIME_WAIT(主动断开后的等待状态)等杂项。
HTTP 层出现 502 Bad Gateway 的时候,如果后端服务确实在跑,ss -ltnp检查端口监听,curl直接在后端本机试一次,两步下来基本能摸清是中间件的问题还是后端没起来。
5.2 CPU、内存、磁盘:三个经典指标怎么看
top一打开,上半部分是系统概况,下半部分是进程排行。系统概况重点看load average——过去 1 分钟、5 分钟、15 分钟的平均负载。很多人误把负载当 CPU 使用率,其实负载是"正在运行和等待运行的进程数",负载大于 CPU 核数就说明在排队,系统复杂度开始上来了。比如 8 核的机器 load average 超过 8,就得注意了。
内存方面,free -h看的是总量和已用,但更重要的是注意 Linux 的"缓存"机制。Linux 会把空闲内存作为文件缓存,让读写更快。所以看free输出时,真正可用的内存大约是available那一列,而不是free那一列。很多人看到 free 只有几百 MB 就慌,其实 available 还有好几 GB,虚惊一场。
磁盘方面,df -h看分区用量,du -sh *看当前目录下各文件/目录的大小。生产上磁盘空间突然满了,比较快的定位方式:df -h找到哪个分区满,然后cd到对应挂载点,du -sh * | sort -rh | head一层层往下看,几分钟就能定位到大文件或大目录。sort -rh是按人类可读大小倒序排列,比du加sort -n更直观。
5.3 crontab:定时任务的正确姿势
提到系统资源,顺便说一个和定时紧密相关的工具crontab。我见过太多"脚本明明写好了,就是不执行"的例子,基本都栽在两个地方。一是crontab执行时的环境变量和手动执行不同,PATH可能没包含/usr/local/bin,导致脚本里某些命令直接找不到。解决方法是脚本里尽量写绝对路径,或者第一行写. /etc/profile让环境初始化一下。二是crontab的%要转义。%在 crontab 里是有特殊含义的(表示换行、标准输入),写日期比如$(date +\%Y-\%m-\%d)时百分号必须加\。这个小细节我踩过不止一次。
# 每天凌晨 3 点备份数据库(注意 % 转义) 0 3 * * * mysqldump -u root mydb | gzip > /data/backup/db_$(date +\%Y\%m\%d).sql.gz写完 crontab 之后,用crontab -l查看是否生效,然后用tail -f /var/log/cron(CentOS)或grep CRON /var/log/syslog(Ubuntu)看有没有真正执行,这是排查定时任务的三板斧。
6. 常见问题与排查技巧实录:这些年踩过的坑
这部分是重点中的重点。前面讲的都是正常流程,但真实项目里永远有意外。我把这些年实际遇到、帮人排查过的高频问题整理一下,每个都给出了排查思路,不是直接甩结论。
6.1 钥匙开不了门:Permission denied 的排查思路
新人在服务器上部署代码,最常见的报错就是Permission denied。这个错的原因就两类:文件权限不足、文件属主不对。查看方法:
ls -l 目标文件 id 当前用户看你的用户名在不在文件的属主或属组里,以及对应位的权限够不够。还有一种隐蔽情况:文件权限正常,但文件所在目录缺少 x 权限,照样进不去。所以排查时要一层层往上看:ls -ld /data /data/www /data/www/myapp,每一层目录都要有合理的 x 权限。我自己处理过的一个案例是:某团队收到"静态资源 403",检查半天发现文件是 644 权限,属主也对,问题出在/data/www这层目录权限是 755 中的"其他人可读"缺失。加好目录权限,问题秒解。
6.2 文件删不掉的一个经典场景:进程占用
rm -rf删文件提示Device or resource busy,或者删了之后磁盘空间没释放。原因是文件正被进程打开。排查方式:
lsof | grep deleted这个命令会列出所有已被删除但仍被进程占用的文件。找到对应 PID 后,处理方式有两种:一是重启进程,让系统释放文件描述符;二是特殊情况(比如删掉了日志文件但服务还在写),不一定要想办法把"已删除"的文件恢复,而是告诉服务的日志轮转机制,让服务重新打开新的日志文件。运维里甚至有这样的场景:线上环境快照太大,某个进程占着删除的文件不放,空间就是不见少,最后靠重启容器解决,因为容器里的主进程占用了大量日志句柄。看到deleted标记时别慌,按这个思路处理就行。
6.3 端口被占用:到底是谁占了我的 8080
启动服务提示Address already in use。排查:
ss -ltnp | grep 8080 # 或者 lsof -i :8080看到 PID 和进程名之后,确认是不是自己之前启动的服务。如果是需要停掉的,优先用常规方式(kill PID),不行再用kill -9 PID。这里有一条重要经验:不要盲杀。我曾见过有人把ss输出里的 PID 看错,把别的服务的进程给杀了,事故现场眼泪都来不及掉。先ps -fp PID看一眼进程的全貌再动手,费用只有 0.1 秒。
6.4 磁盘突然满了:大文件定位技巧
磁盘告警是最常见的线上告警之一。排查效率最高的路径:
df -h du -sh /var/log/* | sort -rh | head du -sh /data/* | sort -rh | head日志目录是重灾区。journalctl的日志(systemd 日志)默认不会无限增长,但有的系统配置了,老的日志一直不清理。快速释放空间可以用:
journalctl --vacuum-size=200M把 systemd 日志压缩到 200M 以内。如果是 Nginx 或 Tomcat 日志疯长,要找具体日志文件,再用truncate -s 0 /var/log/nginx/access.log而不是直接rm——直接删文件会导致进程还握着旧文件句柄,空间照样不释放。这也是为什么很多人"删了日志文件空间没变"的谜团所在。
6.5 命令敲了半天没反应:终端假死还是系统真卡
碰到"命令输不进去、按回车没反应",先确认终端本身活着没有。按一下Ctrl+C取消当前任务,如果可以回到提示符说明只是某个命令卡住了。如果完全没反应,可能是终端窗口在远程连接下卡住了,退出重连试试。如果是系统级负载过高导致整体卡顿:
uptime看 load average 是不是超出 CPU 核心数很多。如果可以执行命令,用top -b -n 1非交互模式抓一次快照,看 CPU 时间占比最大的进程,排查是业务进程冲上去了,还是挖矿木马之类把服务器资源耗尽了。top -b -n 1的意思是一次性批量输出 top 的结果,适合后续处理这些数据,不用开交互界面干瞪眼。
6.6 常见问题速查表
| 现象 | 可能原因 | 优先排查命令 |
|---|---|---|
| Permission denied | 权限/属主不对 | ls -l、id |
| Address already in use | 端口被占用 | ss -ltnp、lsof -i :端口 |
| 删了文件空间没释放 | 进程占用文件句柄 | `lsof |
| 磁盘满告警 | 日志/大文件堆积 | df -h、du -sh * 一层层看 |
| 服务起不来 | 端口冲突、磁盘满、依赖缺失 | 前四层检查法对照组 |
| 定时任务不执行 | 环境变量、% 转义、权限 | crontab -l、/var/log/cron |
| 系统卡顿 | 负载过高、资源耗尽 | uptime、top -b -n 1 |
| 命令找不到 | PATH 变量不完整 | which 命令、echo $PATH |
| 中文乱码 | 系统没装中文字体或 locale | locale、cat /etc/locale.conf |
7. 写给新手和高手的几点心得
说了这么多,最后真心实意聊几句。第一,Linux 不用背命令。你只需要把最核心的几十个命令弄明白,剩下的交给man和--help。我工作这些年,绝大部分命令都是边查边用,最后用熟了的才记住。遇到没见过的命令,先man一下看看它到底是做什么的,比瞎猜效率高十倍。
第二,养成用 Linux 写笔记和做日常任务的习惯。我自己从最开始的"Windows 打天下",到后来慢慢习惯在 Linux 下跑开发服务、写脚本处理日志、甚至直接用 Vim 写文件,这个过渡有很大帮助。真正常用的命令和习惯,不用刻意背,顺手之后就内化了。
第三,给自己造轮子。比如我后来把自己的所有"笔记"都放进一个自建的~/notes目录,用find、grep、awk快速检索,配合vim写笔记,效率极高。用grep -r "关键词" ~/notes找到自己半年前写的一段笔记,这种检索体验一旦用过就回不去了。
我还想针对现在的新手多补一句:别被"Linux 很难"的刻板印象吓住。它和 Windows、macOS 一样,只是一个操作系统。把它当工作台而不是考试题,遇到问题就查、就试、就记录,积累一两个月,你会发现自己已经能独立处理很多曾经一脸懵的场景。
最后再分享一个小技巧:把history命令的输出和grep组合起来。history | grep ssh能快速找回你两周前用过的 ssh 登录命令。history记得配合!操作符使用,比如!123重新执行历史记录里第 123 条命令,!!重复执行上一条命令。这些是最低成本、最高回报的小技巧,就像电灯开关一样,你知道它在哪,日常就顺了。
Linux 这条路并不拥挤,因为放弃的人远比坚持下来的人多。这篇笔记是我多年填坑后的纯手动摘要,没有工具、没有捷径、没有"三分钟精通",有的只是从真实环境里磨出来的可复现经验。你把它存下来,遇到问题翻一翻,会比收藏夹里吃灰的一百篇教程更有用。