兄弟们,聊到 Linux 基础命令,很多人第一反应就是“背命令”。刚入行那会儿我也干过这事儿,对着书抄了几十页的笔记,结果一到真实环境,依然两眼一抹黑。后来踩过无数坑才明白,Linux 命令从来不是靠死记硬背学的,而是靠理解它的设计逻辑和反复实操养成的习惯。这篇东西我不打算给你罗列一张“史上最全命令表”,那样太空洞了,而是想从一个老运维和新手聊天的角度,把那些真正高频、真正能救命的命令掰开揉碎了讲清楚,说说每个命令背后的原理、常见的坑,以及我实践中总结的排查思路。内容尽量保持在“基础”的范畴内,但会把基础讲透,让你看完之后不仅知道敲什么,更知道为什么这么敲。
1. 学习Linux命令的正确心态与整体框架
1.1 命令的本质:程序、参数与输出
先别急着敲命令,你得在脑子里建立第一个观念:Linux 下的每一个命令,本质上都是一个可执行的程序。你输入ls,系统会在 PATH 环境变量定义的目录列表里(比如/bin、/usr/bin)找到名为ls的可执行文件,然后运行它。所以命令不是什么神秘咒语,它和你在 Windows 上双击一个 exe 文件没有本质区别,只是换成了在终端里通过文本交互。
第二个观念是“一切皆文件”。在 Linux 世界里,普通文件是文件,目录是文件夹,但你的键盘输入(stdin)、屏幕输出(stdout)也是文件,甚至硬盘设备、网络接口都被抽象成了文件。这个思想贯穿整个系统设计,也是理解后面重定向、管道、权限这些概念的地基。比如为什么>能把输出写到文件里?因为命令的输出本身就是往一个文件描述符里写内容,你把这个描述符指向一个普通文件,数据自然就落盘了。
第三个观念是“命令 + 参数 + 选项”的结构。大多数命令遵循这个格式:命令名 [选项] [参数]。选项通常用-开头表示短选项(如-l),用--开头表示长选项(如--long),参数则是操作对象。理解这个结构,你就能猜出陌生命令的大致用法,也能更好地阅读文档。
1.2 先掌握哪些命令:一条最少可用路径
我的建议是,别一开始就追求“全”。很多学习资料恨不得把几百个命令列成表,那是词典不是入门指南。真正的高频命令就那么几十个,你先按下面这个清单走一遍,能在系统里自如地逛文件、查状态、改配置,就算入门了:
- 文件与目录:
pwd、ls、cd、touch、mkdir、rm、mv、cp、cat、less、head、tail - 文本处理:
grep、sed、awk、cut、sort、uniq、wc - 权限与用户:
chmod、chown、useradd、usermod、sudo - 进程与资源:
ps、top、kill、df、du、free - 网络:
ping、curl、ip、ss - 查找与压缩:
find、locate、tar、gzip、zip
把这张清单里的人做到“肌肉记忆”,剩下的命令遇到时现查man完全来得及。我也很推荐你在电脑上建一个虚拟机或者开个容器,每天拿十分钟随便玩一玩,把文件删错了、把服务搞挂了都没关系,折腾本身就是最好的学习。
1.3 man、help与命令帮助的用法
很多新手不知道的是,Linux 系统自带的帮助文档其实是最被低估的学习资源。man命令可以查看几乎任何命令的手册,比如man ls。手册通常分好几个章节,最重要的是SYNOPSIS(语法概要)和DESCRIPTION(详细说明),里面会解释每个选项的含义。除此之外,大多数命令还支持--help选项,比如ls --help,会打印一个精简版的使用说明,适合快速查阅。
不过我建议你不要一头扎进英文文档就劝退。看 man 页面是有技巧的:先只关注你用得上的一两个选项,别想着一次全记住。比如今天我只想搞清楚cp -r和cp -a有什么区别,那就直接搜索 COPY 相关段落,不要从头到尾读一遍。把man当成字典而非小说,你的效率会高很多。
2. 文件系统与目录操作:一天也离不开的命令
2.1 pwd、ls、cd:安身立命的三个命令
刚进入终端,第一件事就是搞清楚“我在哪”。pwd(print working directory)会打印当前所在目录的绝对路径,比如/home/user。别小看这个命令,我见过太多人在修改配置文件时因为搞不清当前位置,把内容写到错误文件里的例子。养成习惯:操作前先 pwd 确认一下,成本极低,收益极大。
ls是最常用的列表命令。裸敲ls只显示文件名,但你实际中大概率要用到ls -l(显示权限、属主、大小、修改时间等详细信息)和ls -a(显示隐藏文件,也就是以点开头的文件)。这两个选项经常组合成ls -la使用。我个人非常喜欢ls -lh,h 表示 human-readable,会把文件大小显示成4.0K、128M这种格式,而不是一堆字节数。另外还有ls -lt,按修改时间倒序排列,排查“哪个日志文件最新”时特别好用。
cd是切换目录的命令。绝对路径和相对路径的概念要理解清楚:绝对路径从根目录/开始,比如cd /etc/nginx/;相对路径基于当前目录,比如cd ../conf/表示先回到上一级目录再进入 conf。这里有个小窍门:cd ~回到当前用户家目录,cd -回到上次所在的目录。cd -这个命令救过我很多次,在两个长路径之间来回切换时,比重复输入一长串路径快多了。
2.2 文件的增删改查:touch、mkdir、rm、mv、cp
touch用来创建空文件,或者更新已有文件的时间戳。它的用法极其简单:touch file.txt,文件不存在就创建,存在就把它的修改时间改成当前时间。写脚本时经常用 touch 来生成占位文件或者测试文件,很方便。
mkdir是创建目录的命令。注意mkdir -p这个选项,它允许你一次创建多层嵌套目录,比如mkdir -p /tmp/a/b/c,如果没有-p,只要父级目录不存在就会报错。同理,删除目录时用rmdir只能删空目录,更常用的是rm -r递归删除非空目录。这里我必须强调那个著名的危险操作:rm -rf /,r 表示递归,f 表示强制,合在一起就是递归强制删除,你要是手滑在根目录敲了这个命令,系统基本就废了。我的习惯是,凡是执行带有rm -rf的命令前,先快速检查一遍当前目录和路径,甚至先敲pwd确认自己在哪,再考虑要不要动手。
cp是复制,mv是移动。细节上有几个非常实用的点:cp -r复制目录时必须要加 r;cp -a相当于-rp,不仅递归复制,还保留权限、时间戳、符号链接等属性,用于备份时比cp -r更合适。mv在同一文件系统内是“改名”,跨文件系统时才是真正的“复制+删除”,所以当你需要把一个文件从磁盘 A 挪到磁盘 B 时,mv 的效率其实不高,直接用rsync会更稳。这些细微差别,只有实操时才会发现。
2.3 查看文件内容:cat、less、head、tail
cat会把文件内容一次性输出到屏幕,适合小文件。如果文件很大,用 cat 会把屏幕刷爆,这时候用less分页查看才是正解。less 的功能非常强:支持回车/空格翻页、/关键词搜索、q退出。还有一个很容易被忽略的用途——less可以对输出结果做实时查看,比如配合管道执行命令 | less,特别适合查看一堆报错信息。
head和tail分别查看文件开头和末尾的若干行。默认都是 10 行,通过-n指定行数,比如tail -n 50 app.log。在排查日志时,tail -f是运维人员的神器,f 表示 follow,会持续追踪文件新增内容并打印出来,相当于一个实时日志窗口。我在排查线上接口报错时,通常开三个终端:一个tail -f看应用日志,一个看错误日志,一个留着敲排查命令,效率非常高。
2.4 硬链接与软链接:ln的正确理解
链接是 Linux 文件系统里非常容易混淆的概念。ln -s 目标文件 链接名创建的是软链接(符号链接),它像一个快捷方式,链接文件里存的是目标的路径。软链接可以跨文件系统,也可以指向目录,但不能指向不存在的目标(会变成“死链”)。
硬链接则完全不同,ln 目标文件 链接名创建的是硬链接。硬链接的本质是同一个 inode 的多个文件名,也就是说,你通过任意一个硬链接修改文件内容,其他硬链接也会同步变化,因为底层是同一份数据。硬链接不能跨文件系统,也不能指向目录。理解 inode 这个概念很关键:一句话概括,文件名只是 inode 的一个入口,真正的数据块和元数据都挂在 inode 上。软链接在部署和维护 Web 服务时非常常见,比如把配置文件软链到一块独立挂载盘上,既方便管理又能避免把系统盘占满。
3. 文本处理三剑客与常用文本工具
3.1 grep:过滤与正则
grep是处理文本的第一神器,作用是在文件或标准输入中按模式匹配文本。最简单用法是grep keyword file,把所有包含 keyword 的行打印出来。实际工作中我离不开的是这几个选项:
grep -i:忽略大小写grep -v:反向匹配,输出不包含关键字的行,常用于过滤掉无用的标题或注释grep -r:递归搜索目录下所有文件grep -n:显示行号,方便精确定位到代码或日志的某一行grep -E:使用扩展正则表达式
正则表达式是 grep 的灵魂。基础概念其实不多:.匹配任意一个字符、*匹配前面的字符任意次、^匹配行首、$匹配行尾。比如查找以 “ERROR” 开头的行:grep "^ERROR" app.log;查找以数字结尾的行:grep "[0-9]$" file。掌握这几个,已经能覆盖大多数需求了。我建议你把man grep里的正则说明至少看一遍,熟记常用元字符,工作中真的非常节省时间。
3.2 sed与awk:流编辑与逐行处理
sed是流编辑器,它逐行读取内容、按规则修改后输出,常用于替换操作。最经典的是sed -i 's/old/new/g' file,把文件里所有 old 替换成 new。注意这里的-i表示直接修改文件,不要小看这个选项,它是一次真正意义的“原地编辑”,如果替换规则写错了,文件就被污染了。所以我通常建议,重要文件先跑一遍不带-i的命令查看输出结果,确认无误后再加-i执行,或者先用-i.bak生成备份文件。
sed的用法还有一层很好用的场景:按行提取内容。比如sed -n '10,20p' file打印第 10 到 20 行,-n表示不输出默认模式空间内容,p表示打印。这在查看超大日志文件的中间部分时比 cat 舒服得多。
awk是更强大的文本处理工具,它的默认行为是按空白字符把每一行拆成多个字段,$1代表第一个字段、$2代表第二个字段、NF代表字段总数。比如awk '{print $1, $3}' file打印每行的第一、第三个字段。配合条件匹配可以玩出很多花样:awk '$2 > 100 && $2 < 200' file可以过滤出第二个字段在 100 到 200 之间的行。有这样的工具,你对日志和配置文件字段做统计就不需要写 Python 脚本了。我常做的操作是统计日志里不同状态码的数量:awk '{count[$9]++} END {for (code in count) print code, count[code]}' access.log,一条命令出结果。
3.3 cut、sort、uniq、wc:文本整理四件套
cut按列从文本中截取内容,最常用的是-d指定分隔符、-f指定字段,比如cut -d: -f1 /etc/passwd取所有用户名。sort对文本排序,常用-n(按数字大小)、-r(倒序)、-k(指定排序字段)。uniq去掉连续的重复行,注意它只去除“相邻且重复”的行,所以通常要先sort再uniq,才能对全局去重。
wc用于统计行数、单词数、字节数,wc -l统计行数是最常用的。这四个工具配合管道使用,几乎可以完成 90% 的文本统计任务。举个例子,找出日志中访问次数排前三的 IP:awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 3。这条命令链一次完成了“提取字段、分组计数、按次数排序、取前三名”四个操作,多琢磨几遍你会爱上管道的。
3.4 输入输出重定向与管道
前面提到过,命令的默认输出会打到屏幕,输入来自键盘,但你可以用重定向改变这个流向。>把标准输出写到文件(覆盖原内容),>>追加到文件末尾,2>把错误输出单独写到一个文件,2>&1把标准错误合并到标准输出里。最常见的写法是command > log.out 2>&1,把正常日志和报错一起写入文件,方便完整记录运行状态。新手很容易漏掉2>&1,结果就是明明报错了,你在日志文件里却看不到任何错误信息。
管道符号|把前一个命令的标准输出,直接作为下一个命令的标准输入,这是 Linux 命令行的灵魂设计。比如ls -la | grep nginx就能从目录列表中过滤 nginx 相关的文件。管道配合上面的四件套、三剑客,处理文本数据流可以说无所不能。掌握管道和重定向,是区分“会敲命令”和“会写命令行”的分水岭。
4. 权限、用户与安全基础
4.1 读写执行权限的底层理解
Linux 权限系统是新手最容易困惑的部分,其实是纸老虎。每个文件/目录都有三种角色的权限:属主(owner)、属组(group)、其他人(others)。每种角色有三种权限:读(r)、写(w)、执行(x)。用ls -l看第一列,比如-rwxr-xr--,第一个字符-表示普通文件(d表示目录,l表示链接),后面九个字符每三个一组,分别对应 owner/group/others。rwx表示读、写、执行。数字表示法也很常用,r=4、w=2、x=1,加起来得到权限值。例如chmod 755 file表示 owner 是 rwx(7),group 是 r-x(5),others 是 r-x(5)。
要特别理解目录权限和文件权限的区别。目录的 r 权限意味着能列出目录里的文件名,x 权限意味着能进入这个目录(相当于 cd 进去),w 权限意味着能在目录里创建、删除文件。所以一个目录如果只有 r 而没有 x,你是无法用ls -l看到文件详细信息的,甚至无法进入目录。这个细节在配置网站目录权限时非常常见,很多人设置了chmod 644给目录,结果网站报 403,原因就是目录缺少 x 权限,进程无法实际进入目录读取文件。实操里目录常见设置是 755,普通文件常见设置是 644。
4.2 chmod、chown、chgrp的使用
chmod修改权限,前面的数字用法已经覆盖大多数场景。但还有一种场景:你只想给文件加一个执行权限,不想动其他位,可以用符号模式:chmod +x script.sh、chmod u+x file(只给属主加执行权限)、chmod g-w file(去掉属组的写权限)。哪种好用选哪种,但记住关键原则——最小权限原则,能给 644 就不要给 755,能给 755 就不要给 777。777 意味着所有用户都有写权限,在多人服务器上是一种很大的安全隐患,我通常在配置共享目录时即便需要跨用户访问,也会用 ACL 或者分组管理来替代 777。
chown修改文件属主和属组,比如chown user:group file。注意user:group中间是冒号,不要写成点号。chgrp单独修改属组,但实际中chown一次搞定更常见。修改目录时要注意-R选项递归应用,比如chown -R nginx:nginx /data/www/,把整个目录及其内部所有文件的属主、属组统一修改,这样 Web 服务才能正常读写站点目录。
4.3 sudo、su与PATH
su表示切换用户,su不加用户名默认切换到 root,但要输入 root 密码;sudo允许普通用户以受控的方式以 root 权限执行单条命令,只输入当前用户自己的密码,依据/etc/sudoers文件授权。比较安全的实践是 root 账户不开远程登录,管理员通过普通用户 + sudo 提权执行操作,这样审计日志里能清楚看到谁做了什么。
PATH 是另一块重要内容。你敲ls时系统并不在当前目录找,而是按 PATH 环境变量里记录的目录顺序依次查找可执行文件。如果找不到,就会报command not found。解决“命令找不到”,除了确认是否安装了对应软件包,还要确认 PATH 里是否包含它的安装目录。比如很多软件安装在/usr/local/bin,如果你的 PATH 没有包含这个目录,就会遇到“明明安装了却无法执行命令”的诡异现象。查看 PATH 用echo $PATH,临时修改用export PATH=$PATH:/新目录,永久修改需要写进~/.bashrc或/etc/profile。
4.4 umask与安全习惯
umask决定了新建文件和目录的默认权限。它是一个“反掩码”,比如常见的umask 022,意思是新建文件时从 666 里减掉 022,得到 644;新建目录时从 777 里减掉 022,得到 755。umask设置过松(比如 000)会让新文件默认全用户可读写,比较危险。检查当前值用umask,临时修改用umask 027之类的命令。安全习惯方面,我总强调“无需要不开权限”,这既是对文件说的,也是对服务说的。平时用普通用户操作,只有确需提权时再 sudo,能减少很多因手滑导致的系统级破坏。
5. 进程、系统资源与常用诊断
5.1 ps、top、kill:进程管理三连
ps是查看进程状态的命令。直接用ps只能看到当前终端启动的进程,实践中几乎都用ps -ef或ps aux把所有进程列出来。我习惯用ps -ef | grep 关键词来定位某个服务的进程号。输出里关键字段包括 PID(进程 ID)、PPID(父进程 ID)、%CPU、%MEM、CMD 等。
top是动态的进程监控工具,像 Windows 的任务管理器,但能力更强。进入 top 界面后,P按键按 CPU 排序,M按键按内存排序,k可以杀进程(会直接提示输入 PID),q退出。排查系统卡顿时,我第一件事就是top,先看整体负载(load average),再看是不是有进程把 CPU 或内存占满了。
kill用于终止进程。kill PID默认发送的是 SIGTERM(15),请求进程“优雅地退出”,给它时间去清理资源。如果进程无响应,再用kill -9 PID发 SIGKILL 强制结束。我强烈建议优先使用普通 kill,而不是上来就-9,因为-9直接干掉进程,可能导致数据丢失或状态错乱,比如数据库实例或者正在写文件的进程,被-9砍掉后可能留下损坏的数据。还有一种情况,杀掉父进程后子进程还在,这时候需要用pkill -f 模式或者ps -ef找到所有相关进程再清理。
5.2 df、du、free:资源查看
磁盘空间和内存是日常最常排查的问题。df -h查看各文件系统的总大小、已用、可用量和挂载点,重点关注根分区/和业务数据分区。du -sh 目录名查看指定目录总大小,du -h --max-depth=1 /var/log/可以看到下一级目录的大小,一层层排查哪个文件占用空间最多。我有个习惯:磁盘快满时,先df -h确认问题分区,再du -sh /*或du -sh /var/*逐级定位,速度极快。
free -h查看内存使用情况。注意 Linux 的内存机制里,空闲内存并不是单纯看 free 列,还要看buff/cache列,它表示系统用内存做的文件缓存。大家常问的“明明 free 很小,内存到底满不满”,要看available列,它才是真实的可分配内存。当 available 很低、系统开始频繁用 swap 时,性能才会受明显影响。
5.3 系统服务与systemctl基础
现代主流发行版基本都使用 systemd 管理系统和服务,与之打交道的命令是systemctl。最常用操作:systemctl start 服务名、systemctl stop 服务名、systemctl restart 服务名、systemctl status 服务名,以及设置开机自启的systemctl enable 服务名和取消的systemctl disable 服务名。排查问题时的顺序一般是:
systemctl status nginx看服务的运行状态、最近日志、主进程 PID;- 如果状态是 failed,用
journalctl -u nginx -n 50查看最近 50 行日志定位失败原因; - 修改配置后务必
systemctl reload 服务名(重载配置,不中断服务)或systemctl restart(完全重启)。
很多新手会混淆 reload 和 restart。我个人的实践是:改配置文件用 reload,因为不中断服务对线上影响更小;但是改代码、动态库之类的内容时,还是 restart 更干净。
5.4 日志查看:journalctl、dmesg、log目录
日志是排查问题的第一现场。systemd 时代,集中查看服务日志用journalctl非常方便:journalctl -u nginx看指定服务的全部日志,journalctl -u nginx --since "30 minutes ago"看最近半小时的,journalctl -u nginx -f实时跟踪。传统日志目录/var/log/也仍然重要:/var/log/messages(或/var/log/syslog)记录系统整体信息,/var/log/secure(或/var/log/auth.log)记录认证和登录信息,/var/log/cron记录定时任务执行情况。排查内核相关问题时用dmesg查看内核环形缓冲区消息,比如硬件报错、设备挂载、OOM killer 触发记录等。OOM 的线索经常让应用莫名崩溃——你查应用日志查不出问题,结果dmesg | tail一看,原来是内存不够,内核直接把进程杀了。
6. 网络基础命令:排查不求人
6.1 ping、curl、wget
ping用来测试网络连通性,通过 ICMP 协议发送探测包并等待响应。ping -c 4 baidu.com会只发 4 个包然后停止,如果不带-c,默认会一直发下去,需要手动 Ctrl+C 终止。ping 不通时,先别急着认定网络断了,要考虑三种常见情况:目标禁止 ICMP(很多云服务器默认禁 ping)、本地防火墙拦截、路由不通。所以 ping 不通不代表 HTTP 访问一定失败,你要结合后面的 curl 来判断。
curl才是真正模拟应用层访问的工具。curl -v URL能打印详细请求和响应头信息,-I只发送 HEAD 请求查看响应头,-o把下载内容保存到文件。排查接口问题时,curl -v能帮你判断是 DNS 解析失败、TCP 连接超时、TLS 握手失败还是 HTTP 状态码异常。可以说,掌握 curl 的花式用法,网络排查能力直接上一个台阶。
wget是老牌的下载命令,可以下文件、抓镜像、断点续传。虽然 curl 也能下载,但 wget 适合批量下载和后台任务,wget -c URL支持断点续传,下载大文件时非常稳定。
6.2 ip、ss、netstat
传统习惯里排查端口用netstat,但我更推荐你直接学ss,它更快、信息更全。ss -tlnp查看所有监听中的 TCP 端口和对应进程,这个命令的解读要熟练:-t只看 TCP、-l只看监听状态、-n显示数字端口、-p显示进程信息。你启动了一个服务却访问不了,先ss -tlnp | grep 端口号确认服务有没有真的监听。如果没有监听,说明服务没起来或配置有问题;如果监听在 127.0.0.1 而不是 0.0.0.0,说明服务只绑定了本机回环地址,外部请求自然进不来。
ip命令是配置网络接口的现代工具,ip addr查看本机所有 IP 地址和网卡状态,ip route查看路由表。老派的ifconfig很多系统已经默认不自带了,建议直接从ip命令入手。
6.3 DNS与端口排查思路
排查网络问题,我总结了一个顺序。先ping 目标IP判断三层连通性,再ping 目标域名判断 DNS 解析是否正常,用nslookup 域名查看解析到的具体 IP,再curl -v尝试实际访问。如果 curl 报错,看错误卡在哪个阶段:解析失败通常是 DNS 问题,连接超时是三层或防火墙问题,证书报错是 TLS 配置问题,HTTP 4xx/5xx 才是业务层的毛病。跟着这套顺序走,大部分网络问题都能快速定位到具体环节,而不是瞎猜。
7. 查找、压缩与其他高频命令
7.1 find与locate
find是文件查找的最强工具,也是新手最容易读得头皮发麻的命令之一,因为它参数多,但按需记忆并不难。核心用法就几类:按文件名find /data -name "*.log",按大小find / -size +500M(大于 500M 的文件),按时间find /data -mtime -1(最近一天内修改的文件)。-mtime是排查“哪个日志文件最近变了”的利器。find 的常见搭配是-exec,比如find /data -name "*.tmp" -exec rm {} \;,一条命令干掉所有匹配文件。但用-exec rm时必须小心,{}会被替换为找到的每个文件路径,\;是命令结束符。建议先不加-exec跑一遍 find 看输出,确认范围再执行删除。
locate是基于数据库的快速查找,但它依赖系统的定期更新索引(通常每天更新一次),新建的文件可能查不到,需要updatedb手动更新。优点是速度极快,适合找“系统里到底有没有这个文件”的场景。
7.2 tar、gzip与zip压缩
压缩是日常高频操作。Linux 里最经典的是tar配上 gzip:tar -czvf archive.tar.gz 目录/表示打包并压缩(c=create,z=gzip,v=verbose,f=file)。解压则用tar -xzvf archive.tar.gz(x=extract)。很多文档会精简成tar -czf和tar -xzf,省掉 v 避免刷屏。还有一种非常实用的解压方式:tar -xzf archive.tar.gz -C /目标目录,指定解压路径。压缩率更高的tar -cjf用 bzip2,稍微慢但文件更小;zip 格式则多用于和 Windows 环境交换:zip -r archive.zip 目录/、unzip archive.zip。
备份数据时我有几个细节经验:第一,打包前用du -sh确认目录大小,排除掉明显异常的目录;第二,用tar的排除参数--exclude='log/*'避免把大日志文件打进去;第三,备份完成后立即解压验证一遍,避免备份文件损坏后到恢复时才发现。
7.3 alias、history与Shell技巧
alias给常用命令设置别名,提高效率。比如alias ll='ls -l',很多系统默认就配置了ll。我自己的机器上常用alias ..='cd ..'、alias dfh='df -h'。这些别名写入~/.bashrc才会永久生效,改完后要source ~/.bashrc重新加载。
history可以查看历史命令记录,Ctrl+R反向搜索历史命令非常高效,比手动翻上下键爽得多。如果敲了一段长命令,想重新编辑,Ctrl+A跳到行首、Ctrl+E跳到行尾,Ctrl+W删除一个单词,这几个快捷键基本能让你的输入效率翻倍。建议把history配合grep使用——不记得某个命令的参数了,history | grep 关键词就能找回来。
7.4 环境变量与PATH
环境变量决定了命令行程序的运行环境,最重要的一是前面说过的PATH,另外还有HOME、LANG(语言编码)、EDITOR(默认编辑器)等。查看所有环境变量用env,查看单个用echo $变量名。修改环境变量的语法是export 变量=值,比如export LANG=en_US.UTF-8。这些设置要永久生效,同样放进~/.bashrc或~/.profile里。关于环境变量,最值得记住的坑是:脚本里修改的环境变量不会影响父 Shell,所以如果你写了一个脚本导出变量,脚本执行完,你在终端里echo不到这个变量,这属于进程隔离的正常现象。
8. 常见问题与实战排查记录
8.1 权限不足的排查
“Permission denied” 是高频报错。遇到这个先别急,按三个维度检查:
- 你有无权限访问这个路径的每一级目录?比如路径
/var/www/html,不仅 html 目录本身要有权限,/var、/var/www也要有执行权限,否则会被中途拦住; - 文件本身的 owner、group、others 权限是否包含你需要的操作?用
ls -l查看; - 进程用户是谁?很多 Web 服务的权限问题不是你的交互用户,而是运行服务的工作用户(如 nginx 用户)对目标路径没有读权限。
排查工具上,用id 用户名确认当前用户所属组,用namei -om /长/路径打印每一层目录的权限归属,一眼就能看出卡在哪一层。这条命令知道的人不多,但排查目录权限问题极其好用。
8.2 端口被占用的处理
“端口被占用”在启动服务时非常常见。处理思路:先用ss -tlnp | grep 端口号找到占用端口的进程 PID,然后通过ps -ef | grep PID确认这个进程是不是你要找的。如果是残留的旧进程,kill PID之后再启动你的服务;如果这个进程不可杀,那就换个端口启动,或者直接改配置文件把服务绑定到空闲端口。千万不要为了“清理端口”把重要业务的进程乱杀掉,那是非常危险的。
8.3 文件被删除但空间没释放
这是一个经典的诡异现象:你明明用rm删除了一个大日志文件,df -h却显示可用空间没有变化。原因是,某个进程仍然持有这个文件的文件句柄,即使文件名已经没了,底层数据块还没有真正释放。排查方法:lsof | grep deleted找到已删除但仍被占用的文件,定位到对应进程。处理方式通常是 reload 或重启该进程,让它释放文件描述符,空间才会真正释放。这个场景在 Tomcat、Nginx 这类长期运行的服务上特别常见。
8.4 命令找不到的常见坑
遇到command not found,检查顺序是:
- 是不是命令本身没安装?对应发行版用包管理安装,比如 CentOS/RHEL 用
yum install -y 软件名,Ubuntu/Debian 用apt-get install -y 软件名; - 是不是安装到了非标准目录,不在 PATH 中?用
find / -name "可执行文件名"全盘查找,找到后把所在目录加入 PATH,或者用绝对路径直接执行; - 是不是交互式 Shell 能用的命令,在脚本里用不了?这种情况通常是
~/.bashrc里设置的 PATH 只对交互 Shell 生效,脚本环境是全新的,解决办法是在脚本开头显式export PATH=...。
下表是对高频排查命令的一个速查,方便你平时遇到问题快速定位。
| 排查场景 | 首选命令 | 关键要点 |
|---|---|---|
| 服务没起来 | systemctl status 服务名 | 看状态和最近日志 |
| 端口没监听 | ss -tlnp | 确认监听地址和 PID |
| 磁盘空间满 | df -h、du -sh 目录 | 从根目录逐级向下查 |
| 进程卡死 | top、ps -ef、kill | 先 SIGTERM 再 SIGKILL |
| 日志忘了在哪 | journalctl -u 服务名 -f | systemd 服务的集中日志 |
| 网络不通 | ping、curl -v | 三层通不通、应用层通不通 |
最后再分享两个我在日常操作里反复用到的经验。
第一,养成操作前“预览”的习惯。不管执行什么重要命令,尤其是带删除、覆盖、批量操作的,先想清楚:这条命令会作用于哪些文件?范围对不对?如果不确定,先加个echo或者用ls列出目标对象看看。比如rm -rf /data/*和rm -rf /data /*就差一个空格,但一个是删 data 目录下所有内容,一个是把根目录下所有内容搭进去删,这种错误一旦发生就很难挽回。
第二,在备份或大规模修改前,先给自己的行为加一道保险。改配置文件前先cp 配置 配置.bak,批处理前先用测试目录或者小范围数据跑一遍,确认无误再上真实数据。这些不起眼的习惯,能帮你避开绝大多数“一失足成千古恨”的运维事故。Linux 命令的学习没有捷径,但有一条最值得走的路:多敲、多看man、多复盘错误。把这里的命令和排查思路吸收进去,再去面对自己的服务器,你会明显感觉到心里有底很多。