
如果你跟我一样每天早上打开电脑第一件事就是打开终端那你应该会有同感Linux的操作指令不是背出来的是用出来的。网上那些“Linux常用命令大全”我也收藏过但真到了服务器宕机、磁盘写满、进程僵死的时刻能救命的从来不是最全的命令而是你真正理解的那几条。这篇文章不是命令字典是我这些年处理实际问题和面试别人时长用的指令集合。按场景分好类每条命令写清楚什么时候用、为什么用、坑在哪里。想系统学Linux的新手、准备Linux面试的求职者、做日常Linux运维的朋友都可以对照着练一遍。1. 文件与目录最常用指令背后的几个安全细节1.1 路径理解绝对路径、相对路径与特殊符号很多新手敲命令死记硬背但最该先搞清楚的是路径。Linux里一切操作都围绕路径展开理解好pwd、cd、ls这三个命令背后的路径体系后面所有指令都会顺手很多。pwd显示当前所在目录cd切换目录ls列出目录内容。这里的关键在于路径写法绝对路径从根/开始比如/var/log/syslog不管你在哪个目录都能直接定位相对路径从当前目录开始比如cd logs如果当前在/var下就切到/var/logs。新手最容易混淆的是几个特殊符号.表示当前目录..表示上一级目录~表示当前用户的家目录-表示上一次所在的目录/是根目录也是路径分隔符。我最想提醒的是cd -这个命令它返回上一次的目录在深层次目录之间来回切换时特别好用比来回敲绝对路径快得多。另外写Shell脚本时尽量用绝对路径因为脚本执行时的工作目录往往和你想的不一样我就踩过脚本里写相对路径导致在cron里跑不到目标文件的坑。1.2 增删改查的高频组合ls、cp、mv、rm操作文件离不开这几个命令但每个都有值得注意的细节。ls不要裸用常用组合是ls -l查看详细属性权限、大小、修改时间ls -a显示隐藏文件以点开头的文件ls -lh把大小显示成人类易读的K/M/G格式ls -lt按修改时间从新到旧排序。我习惯在排查问题时用ls -l因为能看到文件属性和链接指向这对定位权限问题必不可少。cp复制文件时cp -r递归复制目录cp -p保留属性时间戳、权限cp -a相当于-pdr带归档性质。很多人不知道cp复制软链接时默认会复制链接指向的内容而不是链接本身想保留链接需要-d选项。如果你要迁移整个目录且要保留所有属性直接用cp -a最省心。mv是移动文件或重命名同一文件系统内是原子操作速度很快跨文件系统比如从/移到挂载的/data时它其实是先复制再删除耗时且如果空间不足会失败。我之前在某台机器上把一个大文件从根分区移动到数据盘结果提示空间不足当时没意识到跨文件系统的本质后来改用rsync配合删除才算解决。1.3 删除指令的教训rm -rf 与安全习惯rm是我见过事故率最高的命令没有之一。rm -rf这种组合一旦路径写错后果就是删错库跑路。我先说正经用法rm -i逐个删除前询问rm -r递归删除目录及里面内容rm -f不询问强制删除。真的必须删除整个目录时会用到rm -rf 目录名但请记住几条安全习惯。第一条删除前先ls确认路径到底是什么。我见过有人想删/tmp/test结果随手敲成/tmp/test/ /var/log注意多余空格差点把日志目录删了。第二条如果是删除大批文件先用find列出确认再借助find ... -delete来删比直接rm -rf多一层保险。第三条如果担心误删可以为日常用户设置别名在~/.bashrc里写alias rmrm -i这样交互式终端里删除时都会先问一遍。但这种保护不能覆盖rm -rf的-f所以更稳妥的方法是安装trash-cli把删除变成移到回收站出问题还能恢复。1.4 目录操作小技巧mkdir -p、du -sh目录操作里最常被忽略的是mkdir -p它可以递归创建多级目录而且如果目录已存在也不会报错。这个参数在脚本里格外重要因为你不确定目标目录的父目录是否已经建好。比如要创建/data/logs/2024/05直接mkdir -p /data/logs/2024/05一次搞定省去逐层 mkdir 的麻烦。查看目录大小用du -sh 目录名-s只汇总不看子目录-h人类可读。排查哪个目录占空间最多时我会在某个目录下执行du -sh * | sort -hr | head把子目录按大小降序排出来。注意du统计的是磁盘占用块不是文件实际字节数所以小文件多的时候统计结果会比文件总大小略大这属于正常现象。2. 系统状态一眼看穿性能排查必用的监控指令2.1 top和freeCPU与内存的真实消耗服务器出问题第一条命令往往是top。top顶部三行是核心信息第一行显示当前时间和负载平均值load average三个数字分别代表1分钟、5分钟、15分钟的负载。如果负载长期超过CPU核心数说明系统可能过载但你也要区分是CPU密集还是I/O等待造成的这要看后面的%Cpu(s)里的us用户态、sy内核态、waI/O等待比例。内存这块最骗人的是free -h。上面显示的used很大但buff/cache也很大这些缓存是系统用来加速文件读写的在应用程序需要时可以回收。真正要看的是available这一列它表示在不触发交换的情况下还能给新程序用多少内存。我曾遇到一台机器free显示只剩几百MB于是准备加内存后来发现available还有十几个G只是很多被文件缓存占了。判断内存压力还要看si和so交换分区读写如果发生大量交换说明物理内存确实不够。2.2 df和du磁盘空间到底被谁占了磁盘空间排查是运维日常高频场景。df -h看文件系统使用率-T还能显示文件系统类型。注意df看的是“已挂载分区”如果服务器有多块盘挂在不同目录你要确认是否有分区挂载到根目录下的某处导致根分区的空间被占满。另一个容易被忽略的是 inode 耗尽。df -i可以看 inode 使用率如果 inode 满了即使df -h显示还有空间也会报“No space left on device”。真正定位谁占空间用du。我通常从根目录开始逐层排查du -sh /* 2/dev/null | sort -hr | head先看根下每一级目录哪个大再一层层往下追。有些目录已经是挂载点比如/proc、/sys是虚拟文件系统不需要管。很多大文件藏在/var/log、/home、/tmp也可以直接find / -xdev -type f -size 500M -exec ls -lh {} \;找大于500M的文件-xdev限定不进入其他挂载点避免全盘扫描。2.3 ps与进程树定位异常进程进程排查绕不开ps。ps -ef和ps aux看到的字段基本一致ps aux的%CPU、%MEM按百分比显示更直观。STAT列是进程状态S表示睡眠R表示运行Z表示僵尸连续看到大量Z就要注意了。僵尸进程杀不掉因为它是父进程没有正确回收子进程资源造成的只能等父进程退出或重启相关服务要找到它的父进程用ps -o ppid -p PID反查。定位高CPU进程直接在top里按P键按 CPU 排序按M键按内存排序。也可以命令行处理ps aux --sort-%cpu | head -5或者ps -eo pid,comm,%cpu --sort-%cpu | head。拿到进程名后别急着kill -9先看它到底是什么ls -l /proc/PID/exe可以看可执行文件路径cat /proc/PID/cmdline | tr \0 可以看完整命令行确认是不是挖矿脚本或业务进程。2.4 进一步定位vmstat、iostat、pidstattop只能看整体状态如果 CPU 高但找不到明确的进程或者怀疑是 I/O 瓶颈需要上vmstat。vmstat 1每秒输出一行重点看r运行队列CPU核心数匹配、b阻塞进程数、si/so交换写入/读出非0说明内存紧张、us/sy/waCPU时间分配。如果wa很高大概率磁盘 I/O 撑不住。这时再用iostat -x 1看磁盘的%util和await%util接近100%说明磁盘确实在高负荷。个人经验是系统慢不一定 CPU 满可能是一条 slow disk 把所有进程拖住。配合pidstat -d 1可以看到每个进程的读写速度精准定位哪个进程在疯狂读盘。这个组合拳在面试里也很加分答得出top之后怎么往下定量分析说明你是真处理过故障。3. 用户与权限管理从useradd到sudo的完整链路3.1 创建用户的正确姿势与常见坑用useradd创建用户经常有人踩坑只执行useradd test创建完发现没有家目录也没有默认的配置文件。这是因为不同发行版对useradd的默认行为有差异。稳妥的做法是useradd -m -s /bin/bash -d /home/test test-m创建家目录-s指定Shell-d指定家目录路径。紧接着必须执行passwd test设置密码否则账户密码是锁定的无法登录。批量创建用户的场景我会用循环脚本比如创建一个叫dev01到dev05的账号并统一设置初始密码再强制他们首次登录修改。删除用户用userdel -r 用户名-r会同时删除家目录和邮件池。如果不加-r用户删了但家目录还留在系统里后面再用同名用户时会看到一堆旧文件容易混淆。3.2 权限位、chmod和chown理解rwxLinux权限分三组属主、属组、其他用户每组三位rwx。数字表示法是 r4、w2、x1所以chmod 755 file表示属主拥有读写执行属组和其他用户只有读和执行。这里我特别强调目录的执行权限x目录如果没有 x你就没法cd进去即使有 r 权限也只能看到文件名列表无法进入。很多人权限设了半天进不去目录就是少了 x。chmod -R递归修改权限时一定慎用。之前有朋友给网站目录递归chmod -R 777结果任何用户都能改写文件没多久被注入木马。正确的做法是先想清楚需要哪种权限普通静态文件 644可执行脚本 755配置文件保持 600 更安全。修改属主属组用chown比如chown -R www:www /var/www/html-R同样递归。注意chown后面是先属主后属组组可以用.或:分隔两种写法都能识别。3.3 sudo配置与安全边界不要随便给ALL普通用户要执行管理命令需要用sudo。第一次用sudo会提示输入当前用户密码前提是当前用户在 sudoers 里。我看到很多新手拿到云主机就直接把用户加到 sudoers还配成NOPASSWD: ALL感觉像给大门留了钥匙链。个人建议能用轮的组件和按需授权就不要一股脑给全部权限。配置 sudo 的正确姿势是visudo它会校验语法避免写错导致 sudo 全废。常见配置格式user ALL(ALL) ALL表示允许 user 在任何主机上以任何用户身份执行任何命令但需要密码%wheel ALL(ALL) ALL表示 wheel 组内用户都有权限user ALL(root) NOPASSWD: /usr/bin/systemctl表示只免密执行 systemctl。生产环境更常见的做法是把运维账号加入wheel组然后给特定的系统管理命令免密。记住修改完最好另开一个终端测试sudo -l确认语法没问题再关当前会话防止把自己锁在外面。4. 进程控制与后台运行让你的任务不被终端关闭4.1 杀进程的正确姿势kill、killall、pkill处理异常进程第一反应不该是kill -9。kill默认发 TERM 信号15让进程自己清理资源后退出这叫“优雅终止”。kill -9是 SIGKILL强制杀掉系统不会给进程任何清理机会可能留下临时文件、端口未释放、数据库事务未完成等后遗症。我的习惯先kill PID等几秒看进程还在不在不行再kill -9 PID。按名称操作用killall或pkill。killall nginx会杀掉所有叫 nginx 的进程pkill -f php.*artisan可以用完整命令行匹配。pkill的坑是匹配范围比预期大比如pkill java会把所有 java 开头的进程全杀了包括别人的程序。所以我更常用pgrep -f先确认要匹配的进程列表再根据 PID 精确处理。处理端口占用是个经典场景。lsof -i:8080能列出占用8080端口的进程没有 lsof 的机器可以用ss -ltnp | grep 8080。杀占用进程时fuser -k 8080/tcp可以一条命令杀掉占用该端口的进程但要小心系统自带服务比如有人误杀过 sshd。4.2 后台运行nohup、、setsid、tmux直接在命令后面加就能后台运行比如php artisan serve 。但很多人发现关了终端SSH窗口后进程也挂了这是因为进程和当前终端会话关联终端关闭时会收到 SIGHUP 信号。解决办法是nohupnohup 命令 日志文件 21 nohup让进程忽略挂断信号 日志文件 21把标准输出和错误输出都写到文件让它后台执行。标准写法长这样nohup python train.py /tmp/train.log 21 。注意21的顺序不能乱它表示把文件描述符2重定向到1当前指向的位置如果写成21 file只会把 stdout 定向到文件stderr 还是指向屏幕经常会出乱子。后台任务也用jobs查看CtrlZ挂起当前任务bg放进后台fg拉回前台。但这些只对当前终端有效要真正可恢复、能随时查看输出的场景我更推荐tmux。tmux new -s train创建一个名为 train 的会话在里面跑任务然后Ctrlb d分离下次tmux attach -t train回来继续看。就算 SSH 断了tmux 会话里的进程还活着。4.3 systemd服务管理systemctl日常操作现代 Linux 发行版的服务管理基本都转向 systemd。常用命令不多systemctl start/stop/restart/reload 服务名systemctl enable/disable 服务名设置开机自启systemctl status 服务名查看运行状态和最近日志。自己写服务时可以创建一个/etc/systemd/system/myapp.service文件。一个最小可用的单元文件长这样[Unit] DescriptionMy Custom Service Afternetwork.target [Service] ExecStart/opt/myapp/run.sh Restartalways Usermyuser [Install] WantedBymulti-user.target写好后执行systemctl daemon-reload再systemctl enable --now myapp开启运行。注意ExecStart要写绝对路径而且如果脚本需要环境变量systemd 默认环境很干净需要在单元文件里加EnvironmentPATH/usr/local/bin:/usr/bin之类的设置。服务挂了以后看日志用journalctl -u myapp -n 50 --no-pager很直观。5. 网络排查与远程操作从连通性到文件传输5.1 网络状态检查ping、telnet、nc、curl网络出问题第一反应是ping。能 ping 通只代表 ICMP 可达不代表服务端口正常。服务器禁用 ping 很常见所以更靠谱的是直接测端口telnet ip port通了会进入空命令行失败会提示连接拒绝或超时有些系统没装 telnet用nc -zv ip port代替。nc -z只做端口扫描不发送数据-v显示详细信息。HTTP 服务用curl测最方便。curl -I https://example.com只看响应头curl -v打印整个请求过程定位是 DNS 解析慢还是 TLS 握手失败。也常用curl -o /dev/null -s -w %{http_code} %{time_total}\n URL测响应时间。真正排查链路问题时我会按顺序查先ip addr看本机 IP 和掩码再ip route看默认路由然后ping 网关最后traceroute看哪一跳丢包。别一上来就怀疑远方先确认本地网卡和路由。5.2 SSH连接问题的排查思路连上后不能输入的常见原因我在社区看到过一个高频提问用 CRT 或 Xshell 能连上交换机但输入指令完全没反应。这在 Linux 服务器上也会出现而且原因分几层。第一层终端类型不匹配。有些设备的 Shell 要求配置正确的终端类型乱码或按键无响应可以试切到VT100或xterm。第二层屏幕文本控制问题按CtrlS会冻结终端输出XON/XOFF 流控输入看起来被“锁死”按CtrlQ恢复。第三层本地客户端的问题比如会话窗口假死重开会话。如果是在 Linux 服务器上还需要检查 sshd 配置里有没有ClientAliveInterval和ClientAliveCountMax导致连接因空闲被掐断查看/etc/ssh/sshd_config后改配置再systemctl reload sshd。排查这类问题的正确顺序是先分清楚是“没连上”“连上没回显”还是“连上但输入无效”再逐层测试。我遇到过最隐蔽的是服务器 CPU 满载sshd虽然接受连接但没法创建 shell 会话看着像能连上实际敲什么都卡住。所以先另开个会话跑top看看是不是资源问题。5.3 文件传输scp、rsync、wget的取舍跨机器传文件scp最直接scp file.txt userhost:/path/传目录加-r指定端口用-P 2222。但scp每次都会全量传大文件不适合增量同步。增量同步用rsync我最常用的参数是rsync -avzP --delete /src/ userhost:/dst/。-a归档保属性-v显示过程-z压缩传输-P边传边显示进度且支持断点续传--delete让目标目录同步删除源端不存在的文件。用--delete时务必小心如果源路径写错比如多写一个/可能把目标目录清空。我一般在正式执行前先加--dry-run即-n跑一遍看会删除哪些文件。下载远程文件用wget或curl。wget -c支持续传wget -r递归镜像站点curl -O下载并保持原文件名。日常服务器上装软件、拉取脚本curl -fsSL更稳定-f表示失败时不输出错误文档-s静默-S出错时显示错误-L跟随重定向。6. 文本处理组合拳grep、sed、awk的实战用法6.1 grep过滤与上下文日志分析里grep是使用率最高的命令。基础用法是grep keyword file但实际工作中很少用裸 grep。grep -E支持扩展正则grep -v反向匹配排除grep -i忽略大小写。看错误日志时我常用grep -rn ERROR /var/log/app/-r递归-n显示行号。如果想把匹配行前后几行也带上用grep -A 5 -B 5 关键字-A是后面几行-B是前面几行这个在定位程序异常原因时特别有用只看报错那一行往往不好分析。搜代码或配置文件时排除干扰项也很重要grep -rn --include*.conf timeout /etc/只搜 conf 文件grep -r --exclude-dirnode_modules TODO /project跳过指定目录。坑点在于如果关键字里有.、*、[等正则特殊字符不想被解释就要加-F或用反斜杠转义比如搜php5.6直接 grep 会把.当成任意字符结果匹配到phpX6用grep -F php5.6才精确。6.2 sed流编辑器做批量替换sed最常用的功能是替换。基本格式sed s/旧/新/g 文件g表示替换一行中所有匹配不是只替换第一个。不加-i只会把处理结果打印到屏幕不改变原文件真的要改文件加-i。我强烈建议先不加-i跑一遍确认结果再加-i执行或者用sed -i.bak s/.../.../ file自动生成备份文件改错还能回滚。在替换路径时有个坑路径里有大量/和新旧字符串里的/冲突标准写法还得转义比如s/\/usr\/local/\/opt/g看起来头大。更省事的是用别的分隔符比如sed s#/usr/local#/opt#g。批量修改配置文件时也能用 sed 按行删除sed -i /^#/d file删除注释行sed -i /^$/d file删除空行。注意sed默认是流式处理不会因为文件大而占用太多内存处理几十 G 的日志也没问题。6.3 awk按列处理那些日志awk的本质是“按列处理文本”。默认按空白符空格或Tab分列$1是第一列$NF是最后一列NF是列数NR是当前行号。比如从 access.log 里取所有访问 IPawk {print $1} access.log。如果日志用逗号分隔用-F,指定分隔符。实际统计场景组合起来特别爽。统计各 IP 访问次数awk {count[$1]} END {for (ip in count) print ip, count[ip]} access.log | sort -k2 -rn | head -10。统计状态码数量awk {code[$9]} END {for (c in code) print c, code[c]} access.log | sort -k2 -rn。这种一行命令能帮你快速判断是不是某个 IP 在刷接口或者 5xx 比例是否过高。awk支持BEGIN{}和END{}前者在处理前执行后者在处理完所有行后执行刚才的统计就是利用了这个特性。写复杂 awk 记得用单引号包住程序体避免 shell 把$1当成变量展开。7. 查找与归档find、locate、tar7.1 find是最强大的查找器也是性能陷阱find的威力在于按任意条件组合查找。按文件名find / -name nginx.conf按类型find /data -type f文件或-type d目录按大小find / -size 1G大于1G按修改时间find /data -mtime -77天内改过的-mtime 3030天前改过的。清理历史日志我常这么用find /var/log -name *.log -mtime 30 -delete一步到位。但注意-delete也不要乱加先不加执行查看再删。性能陷阱在于没加任何限制的find /会遍历所有挂载点包括网络存储/mnt/nfs、虚拟文件系统/proc可能非常慢甚至卡死。实际排查时我会用-xdev表示不跨设备或者直接指定目录范围find /var/log /home /tmp -xdev -name *.log。查找命令不仅要找到文件还能配合处理find . -name *.tmp -exec rm {} \;其中{}表示匹配到的文件\;表示命令结束。locate是基于数据库的查找速度飞快但数据库默认每天更新刚创建的文件可能找不到。用updatedb手动更新后locate keyword能秒出结果。日常快速找文件用 locate精确条件判断用 find互补使用。7.2 归档压缩tar的常用参数与解压到指定目录tar 是 Linux 下最通用的归档工具。打包加压缩一条命令tar -czvf archive.tar.gz /path/to/dir。拆开解释-c创建归档-z用 gzip 压缩生成 .tar.gz-v显示过程-f指定文件名。解压tar -xzvf archive.tar.gz-x解包。如果只想看内容不解压tar -tf archive.tar.gz配合grep还能找压缩包里有没有某个文件。解压到指定目录用-Ctar -xzvf archive.tar.gz -C /opt/app。这个参数非常重要因为默认会在当前目录释放一堆文件容易把当前目录搞乱。我经常下载源码后先建一个目录再释放保持工作区整洁。还有一种情况是打包时想排除某些目录tar -czvf backup.tar.gz --exclude*.log --excludecache /www备份时排除日志和缓存避免归档包巨大。解压 tar.gz 时如果遇到权限问题先分清是文件本身权限的问题还是你没有解压目录的写权限。用tar -tzvf archive.tar.gz | head可以看归档里文件所属用户和权限如果是别的机子的文件打包解压后可能需要chown -R调整属主。8. 包管理与日志排查从装软件到定位故障8.1 apt/yum/dnf包管理器的日常用法Debian/Ubuntu 系用aptCentOS/RHEL/Fedora 系用yum或dnf。日常流程是先apt update同步软件包索引再apt install 包名。升级系统用apt upgrade但生产环境不要随便全量升级尤其内核和核心库容易引发服务不兼容。删除软件用apt remove连带清理依赖用apt autoremove。yum 系对应yum install -y 包名yum updateyum remove。dnf 是 yum 的下一代用法基本一致Fedora 和 RHEL9 默认用 dnf。装软件常踩的坑是包名对不上。比如你想装 nginxUbuntu 里叫nginx但有些衍生发行版可能需要启用特定源才能找到。装完软件后经常要找配置文件位置、启动方式。我的习惯是用dpkg -L 包名deb系或rpm -ql 包名rpm系查看这个包装了哪些文件非常直观。如果你需要换国内镜像源比如阿里云或清华的源先把原源文件备份再替换执行apt update应该能看到源变更。8.2 日志分析组合tail、grep、journalctl服务故障时第一手资料是日志。针对正在持续写入的日志文件用tail -f实时跟踪tail -n 100看最后一百行。但这个组合有个问题日志轮转logrotate会定期把当前日志改名为.gz然后新建空文件你tail的可能已经不是当前那个文件。更保险的是tail -F大写它支持按文件名跟踪即使文件被轮转也能自动重新打开。systemd 管理的服务日志统一走 journald用journalctl -u 服务名 -n 50 --no-pager看最近50行journalctl -u 服务名 --since 2024-01-01 10:00 --until 2024-01-01 11:00按时间窗口查。journalctl -xe是查看最近故障的高频命令-x会补充说明-e跳到文件末尾。真实排错时我一般先看服务状态systemctl status nginx如果挂了我再journalctl -u nginx -n 100 --no-pager看具体报错。如果是应用自己的日志比如 Java 的 log 目录则先ls -lht /var/log/应用名/ | head找出最新的日志文件然后tail -n 200 最新.log。定位到具体报错后再用grep -A 20 Exception或grep -B 10 ERROR看上下文。这套链路走下来90%的问题都能找到线索。在日志分析上还有一个重复出现的经验磁盘写满往往伴随日志暴涨。当你发现服务写不进日志或者卡顿先df -h看磁盘如果使用率 100%最快恢复手段是清理/var/log下的大日志文件但要保留正在写入的那个文件的句柄用 /var/log/xxx.log清空而不是rm否则进程还在往旧文件写空间并不会释放。这个操作也是我在实践中无数次验证过的关键点。最后再分享两个我自己一直坚持的小习惯。第一别囤“命令大全”把上面这些命令所属的细节吃透比收藏几百条一辈子用不上的命令有意义得多。第二高危命令执行之前先想一遍“执行后如果报错怎么回滚”想清楚再敲回车。很多Linux事故都是手比脑子快造成的你多花的那两秒钟可能就省下了一整晚的恢复时间。