首页 / 资讯中心 / 文章详情

服务器命令速查手册:按场景整理Linux运维常用命令与踩坑经验

服务器命令速查手册:按场景整理Linux运维常用命令与踩坑经验 ★ FEATURED ARTICLE
1. 从零搭建一套顺手的服务器命令知识库很多人第一次接触服务器脑子里蹦出来的第一个念头就是“命令太多记不住”。我刚开始那会儿也一样ls、cd、top、df这些还能应付一旦遇到日志排查、进程卡死、磁盘爆满整个人就懵了。后来我发现真正的问题不在于命令数量多而在于没有把它们按“场景”串起来。你不需要背下几百条命令你只需要在遇到具体问题时知道该敲哪一条、参数怎么给、输出怎么看。这篇内容就是围绕这个思路展开的。我会把服务器日常运维中最常打交道的命令按照实际使用场景重新组织一遍不是那种从 A 到 Z 的字典式罗列而是“遇到什么问题用什么命令怎么解读结果”。适合刚上手 Linux 服务器的朋友也适合已经用了几年但总觉得知识零散、想系统梳理一遍的同行。核心关键词就一个服务器命令但我会把它拆成文件操作、进程管理、网络排查、磁盘与性能、日志分析、权限与用户这几大块每一块都配上我实际踩过的坑和验证过的参数组合。先说一个我自己的教训。早年有一次线上服务响应变慢我第一反应是重启结果重启完十分钟又卡了。后来才学会先用top看负载再用iostat看磁盘 IO最后定位到是一个日志文件把磁盘写满了。如果当时手边有一套按场景整理的命令清单可能五分钟就解决了。所以下面这些内容你可以直接当成自己的“服务器命令速查手册”来用也可以在此基础上继续扩充。2. 文件与目录操作别只会 ls 和 cd2.1 查看文件内容时cat、less、tail 到底怎么选很多人一上来就用cat文件小的时候没问题一旦遇到几百兆的日志文件终端直接卡死只能强制关掉重开。我的习惯是小于 100 行的配置文件用cat大文件一律用less实时日志用tail -f。less的好处是可以上下翻页、搜索关键字按/输入关键词回车就能定位。退出按q。如果你只想看文件末尾的几十行tail -n 50 filename比cat高效得多。实时跟踪日志用tail -f filename但要注意如果日志滚动特别快终端会刷屏这时候可以配合grep过滤比如tail -f app.log | grep ERROR。还有一个容易被忽略的命令是head默认看前 10 行适合快速确认文件格式。比如拿到一个 CSV 文件先head -n 3 data.csv看看列名和分隔符再决定怎么处理。提示cat还有一个常见用法是合并文件cat file1 file2 file3但要注意会覆盖目标文件如果 file3 已存在且重要先用追加或者提前备份。2.2 查找文件find 和 locate 的取舍find是服务器上最强大的查找工具但参数多、速度慢。locate基于预建索引速度快但可能不是最新结果。我的经验是临时找文件用find日常高频查找用locate但记得定期updatedb。find最常用的几个场景按文件名查找find /var/log -name *.log按修改时间查找find /tmp -mtime 77 天前修改的按大小查找find / -size 100M大于 100M 的文件查找后执行操作find /tmp -name *.tmp -exec rm {} \;这里有个坑find /会遍历整个文件系统包括/proc、/sys这些虚拟目录速度极慢还可能报错。建议限定目录范围或者用-xdev参数避免跨文件系统。locate的用法很简单locate nginx.conf但它依赖/var/lib/mlocate/mlocate.db这个数据库新创建的文件可能搜不到。手动更新用updatedb但注意这会消耗一定 IO别在业务高峰期跑。2.3 文件权限与属主chmod 数字法的快速心算chmod有两种写法符号法和数字法。符号法适合微调比如chmod ux script.sh给属主加执行权限。数字法适合一次性设定比如chmod 755 script.sh。数字法的规则是读r4写w2执行x1三组权限分别对应属主、属组、其他用户。所以 755 就是属主 4217属组 415其他 415。常用的组合有数字含义典型场景644属主读写其他只读普通文件、配置文件755属主读写执行其他读执行脚本、目录600只有属主读写私钥、敏感配置700只有属主读写执行私有目录改属主用chown user:group filename递归改目录用-R。但-R要小心别把系统目录的属主改乱了。我一般会先ls -l确认当前权限改完再ls -l复核一遍。3. 进程与资源管理top 之外的进阶工具3.1 用 top 和 htop 快速定位高负载进程top是服务器上最常用的实时监控工具默认按 CPU 使用率排序。进入界面后按M按内存排序按P按 CPU 排序按1展开每个 CPU 核心的详情。退出按q。但top的交互体验一般如果服务器上装了htop我更推荐用它。htop有彩色界面、支持鼠标点击、可以直接杀进程还能横向滚动看完整命令。安装命令因系统而异Debian/Ubuntu 系用apt install htopRHEL/CentOS 系用yum install htop。看top输出时重点看三行第一行的load average第二行的Tasks第三行的%Cpu(s)。load average的三个数值分别是 1 分钟、5 分钟、15 分钟的平均负载。如果 1 分钟值远高于 15 分钟值说明负载在突增如果三个值都高说明系统持续繁忙。一般来说负载值不应超过 CPU 核心数超过就说明有进程在排队。3.2 ps 与 pgrep精准找到目标进程ps aux是最常用的进程查看命令输出所有用户的进程。但输出太长通常配合grep使用ps aux | grep nginx。这里有个小坑grep本身也会出现在结果里可以用grep -v grep过滤掉。更优雅的方式是用pgreppgrep -a nginx直接列出进程名匹配的进程和完整命令。pgrep -u root列出 root 用户的进程。如果要看进程树用pstree -p能直观看到父子进程关系。杀进程用kill默认发 TERM 信号15让进程自己清理退出。如果进程无响应用kill -9发 KILL 信号强制终止。但-9是最后手段因为进程来不及保存状态可能导致数据不一致。我一般先kill等几秒不行再kill -9。3.3 后台任务与 nohup让命令在断开后继续跑SSH 会话断开后前台运行的命令会被终止。如果想让一个耗时任务继续跑有两种方式nohup和screen/tmux。nohup的用法nohup long_running_command output.log 21 。这里 output.log把标准输出重定向到文件21把标准错误也重定向到同一文件最后的让命令在后台运行。执行后会返回一个进程号可以用jobs -l查看后台任务用fg %1调回前台。但nohup的缺点是任务管理不方便看不到实时输出。所以我更推荐tmuxtmux new -s mysession创建一个会话在里面跑命令按CtrlB然后D分离会话。下次 SSH 进来用tmux attach -t mysession重新连接输出还在。screen类似但tmux的分屏和复制模式更好用。4. 网络排查从 ping 到 tcpdump 的完整链路4.1 连通性检查ping、telnet、curl 的分工ping是最基础的连通性测试ping -c 4 example.com发 4 个包就停。但很多服务器禁 ping所以 ping 不通不代表服务不可用。telnet用来测端口telnet 192.168.1.1 80如果显示Connected说明端口开放。但telnet默认没装可以用nc -zv 192.168.1.1 80替代-z表示只扫描不发送数据-v显示详细信息。curl更强大能直接发 HTTP 请求curl -I http://example.com只看响应头curl -v显示完整请求过程。排查接口问题时我常用curl -X POST -H Content-Type: application/json -d {key:value} http://api.example.com/endpoint来模拟请求。4.2 端口与连接状态netstat 和 ss 的对比netstat -tulnp是经典命令显示所有监听端口和对应进程。但netstat在新版 Linux 上逐渐被ss取代因为ss更快、输出更清晰。ss -tulnp参数含义-tTCP-uUDP-l监听状态-n显示端口号而非服务名-p显示进程。输出里Local Address是监听地址Peer Address是连接过来的地址。如果要看某个端口的连接数ss -tn state established ( sport :80 ) | wc -l。这个命令统计 80 端口已建立的连接数对判断并发量很有用。4.3 抓包分析tcpdump 的常用过滤表达式tcpdump是网络排查的终极武器但输出量大必须配合过滤条件。基本用法tcpdump -i eth0 -nn port 80-i指定网卡-nn不解析域名和端口名port 80只抓 80 端口。更精细的过滤抓特定 IPtcpdump -i eth0 host 192.168.1.100抓特定网段tcpdump -i eth0 net 192.168.1.0/24抓 TCP 标志位tcpdump -i eth0 tcp[tcpflags] (tcp-syn|tcp-fin) ! 0保存到文件用 Wireshark 分析tcpdump -i eth0 -w capture.pcap抓包时要注意权限普通用户可能没权限需要sudo。另外抓包会消耗 CPU 和磁盘别长时间跑抓完及时CtrlC停止。5. 磁盘与性能df、du、iostat 的组合拳5.1 磁盘空间排查df 和 du 的配合df -h查看各分区使用率-h以人类可读格式显示GB、MB。如果某个分区使用率超过 90%就要警惕了。但df只显示分区级别具体哪个目录占空间要用du。du -sh /var/log查看 /var/log 总大小du -h --max-depth1 /var查看 /var 下每个子目录的大小。这里有个坑du统计的是文件占用的块数可能和df的结果有差异因为被删除但仍在被进程占用的文件不会出现在du里。遇到df显示满但du找不到大文件的情况用lsof | grep deleted查找被删除但未释放的文件。重启对应进程就能释放空间。5.2 磁盘 IO 性能iostat 的关键指标iostat -x 1每秒刷新一次显示每个磁盘的详细 IO 统计。重点看几个指标%util磁盘繁忙程度接近 100% 说明磁盘是瓶颈await平均等待时间毫秒包括排队时间svctm平均服务时间反映磁盘本身性能r/s和w/s每秒读写次数如果%util高但await不高说明 IO 量大但磁盘处理得快如果await远大于svctm说明排队严重可能需要升级磁盘或优化 IO 模式。5.3 内存与交换分区free 和 vmstatfree -h查看内存使用重点看available列这是真正可用的内存。buff/cache是系统缓存虽然算在 used 里但可被回收不用太担心。vmstat 1每秒输出一行关注si和so两列分别是交换分区换入和换出。如果这两个值持续大于 0说明物理内存不足系统在频繁使用交换分区性能会明显下降。6. 日志分析grep、awk、sed 的三剑客用法6.1 grep 的高频参数与正则技巧grep是日志分析的第一把刀。常用参数-i忽略大小写-r递归搜索目录-n显示行号-C 3显示匹配行前后各 3 行-v反向匹配排除某些行正则方面grep -E支持扩展正则比如grep -E error|fail app.log匹配 error 或 fail。如果要统计匹配行数用grep -c。我排查问题时经常用grep -n -C 5 Exception app.log这样能看到异常前后的上下文快速定位问题原因。6.2 awk 按列提取与统计awk适合处理结构化文本。比如日志格式是时间 IP 状态码 耗时用空格分隔那么提取第 2 列awk {print $2} access.log统计状态码分布awk {print $3} access.log | sort | uniq -c | sort -rn计算平均耗时awk {sum$4} END {print sum/NR} access.logawk的内置变量很实用NR是当前行号NF是当前行的字段数$0是整行内容。6.3 sed 批量替换与行操作sed主要用于替换和删除行。替换sed s/old/new/g file.txtg表示全局替换。直接修改文件用-ised -i s/old/new/g file.txt。删除空行sed /^$/d file.txt。删除包含某关键词的行sed /debug/d app.log。打印特定行sed -n 10,20p file.txt打印第 10 到 20 行。sed和awk经常配合使用比如先grep过滤再awk提取最后sed替换格式形成一条完整的处理链路。7. 权限与用户管理useradd、sudo、ssh 密钥7.1 用户与用户组的基本操作创建用户useradd -m -s /bin/bash username-m创建家目录-s指定 shell。设置密码passwd username。删除用户userdel -r username-r同时删除家目录。创建用户组groupadd devgroup。把用户加入组usermod -aG devgroup username-a表示追加不加-a会覆盖原有组。查看用户所属组groups username。7.2 sudo 权限的精细控制直接给用户 root 权限不安全更好的方式是用sudo。编辑/etc/sudoers用visudo命令它会检查语法错误。添加一行username ALL(ALL) NOPASSWD: /bin/systemctl restart nginx这样用户只能免密重启 nginx不能执行其他 root 命令。如果想让用户执行所有命令但需要输密码username ALL(ALL) ALL。但生产环境建议按需授权最小权限原则。7.3 SSH 密钥登录与安全加固密码登录容易被暴力破解推荐用密钥登录。本地生成密钥对ssh-keygen -t rsa -b 4096一路回车。然后把公钥传到服务器ssh-copy-id userserver。服务器端确认~/.ssh/authorized_keys文件权限是 600.ssh目录权限是 700。然后编辑/etc/ssh/sshd_config设置PasswordAuthentication no禁用密码登录PermitRootLogin no禁止 root 直接登录。改完重启 sshd 服务。注意改 SSH 配置前先确保密钥登录已经成功否则可能把自己锁在外面。我一般会开两个终端一个改配置一个保持连接测试。8. 我的常用命令组合与踩坑记录8.1 几条我每天都在用的组合命令查看当前目录下最大的 10 个文件du -ah . | sort -rh | head -n 10实时监控某进程的 CPU 和内存top -p $(pgrep -d, process_name)统计 Nginx 访问日志中 IP 的访问次数awk {print $1} access.log | sort | uniq -c | sort -rn | head -n 20查找并删除 7 天前的日志find /var/log -name *.log -mtime 7 -delete查看某端口被哪个进程占用ss -tulnp | grep :8080这些命令我用了好几年基本覆盖了日常 80% 的排查场景。你可以把它们记在便签上或者写进自己的 shell 别名里。8.2 那些年我踩过的坑第一个坑rm -rf后面跟变量。有一次脚本里写rm -rf $DIR/*结果$DIR为空变成了rm -rf /*幸好当时权限不够只删了当前目录。教训是删除前先echo确认路径或者用set -u让未定义变量报错。第二个坑chmod -R 777图省事。结果把私钥文件也设成了所有人可读安全审计直接报警。后来我学会了按需授权私钥一律 600目录 755脚本 755。第三个坑kill -9杀数据库进程。有一次 MySQL 卡住我直接kill -9结果数据文件损坏花了半天恢复。后来知道数据库要用mysqladmin shutdown或者systemctl stop优雅停止。第四个坑df和du结果不一致。排查了半天才发现是日志文件被删除但进程还在写lsof | grep deleted找到后重启进程才释放空间。8.3 如何持续积累自己的命令库我的做法是建一个 Markdown 文件按场景分类每遇到一个新问题就记一条。比如“磁盘满”下面记df -h、du -sh、lsof | grep deleted“端口占用”下面记ss -tulnp、lsof -i:端口。时间长了这个文件就是自己的知识库。另外善用man和--help。man command看完整手册command --help看快速帮助。遇到不熟悉的参数先查再试别凭感觉敲。最后分享一个小技巧用history查看历史命令history | grep keyword快速找到之前用过的命令。CtrlR反向搜索历史命令输入关键词就能调出最近一条匹配的命令效率极高。服务器命令这东西说到底就是“用进废退”。你不需要一次记住所有但要在遇到问题时知道去哪查、怎么试。上面这些内容是我自己从无数次踩坑中总结出来的希望能帮你少走点弯路。如果你也有自己的常用命令组合不妨也整理一份时间长了你会发现这比任何速查表都管用。
阅读完成 · 觉得有帮助?
咨询建站