1. 服务器命令大全从零搭建一套顺手的运维指令体系刚接手一台新服务器或者临时被拉去救火一台线上机器最怕的不是问题本身而是脑子里一片空白——top看了半天不知道瓶颈在哪df和du结果对不上日志翻了几万行还没定位到关键报错。这种时候一套趁手的服务器命令体系就是救命稻草。我做了十多年运维和后端开发从物理机时代一路走到容器化踩过的坑比敲过的命令还多今天就把我日常真正高频使用的命令整理成一套可复现的体系不是那种“命令大全手册”式的罗列而是按场景串起来告诉你每条命令在什么情况下用、参数为什么这么选、输出怎么读。不管你是刚接触 Linux 的新手还是已经能写脚本的老手这套东西都能直接抄作业。这篇文章覆盖的核心场景包括系统资源排查、磁盘与文件管理、进程与服务控制、网络诊断、日志分析、权限与用户管理、包管理与环境配置以及一些能大幅提升效率的组合技。每个部分我都会给出实际命令、参数解释、输出解读以及我踩过的坑。全文没有花哨的理论全是能直接上机器跑的东西。2. 系统资源排查先搞清楚机器到底怎么了2.1 CPU与内存top、htop、free到底看哪个很多人一上机器就敲top但top的默认输出对新手并不友好。我一般先用uptime看负载uptime # 输出示例 14:32:01 up 23 days, 3:12, 2 users, load average: 0.52, 0.68, 0.71load average三个值分别是 1 分钟、5 分钟、15 分钟的平均负载。关键点这个值要跟 CPU 核心数对比。单核机器 load 到 1.0 就是满负荷4 核机器 load 到 4.0 才算满。我见过有人 8 核机器 load 到 6 就慌得不行其实还有余量。判断标准很简单load average持续超过核心数的 70% 就该关注了。top的交互模式里我常用的几个快捷键按1展开每个 CPU 核心的使用率按M按内存排序按P按 CPU 排序按c显示完整命令行。这些比默认视图有用得多。但top有个问题颜色单调滚动不方便。所以如果机器上能装htop我优先用htop# Debian/Ubuntu apt install htop -y # CentOS/RHEL yum install htop -yhtop的优势是彩色进度条、鼠标点击排序、F9 直接杀进程对新手极其友好。不过生产环境不一定允许你随便装东西所以top的基本功必须扎实。内存方面free -h是最直观的free -h # total used free shared buff/cache available # Mem: 15Gi 3.2Gi 1.1Gi 256Mi 11Gi 11Gi # Swap: 2.0Gi 0.0Ki 2.0Gi这里最大的坑是free列。Linux 会把大量内存用作buff/cache所以free显示很小不代表内存不够。真正要看的是available列它才是应用程序还能用的内存。我见过太多人看到free只剩 1G 就急着加内存其实available还有 11G完全没必要。提示如果available持续低于总内存的 10%并且Swap的used在增长那才是真的内存压力大了。2.2 磁盘与IOdf、du、iostat的配合使用磁盘问题是最容易让人误判的。df -h看的是文件系统层面的使用率df -h # Filesystem Size Used Avail Use% Mounted on # /dev/vda1 40G 35G 3.2G 92% / # /dev/vdb1 200G 45G 145G 24% /data如果/到了 92%就得赶紧清理。但df有个经典陷阱删除了大文件但进程还在持有句柄df依然显示占用。这时候用lsof查lsof | grep deleted | head -20找到那些标记为deleted的文件重启对应进程就能释放空间。这个坑我踩过不止一次尤其是日志文件被rm了但服务没重启的情况。du用来定位具体目录的大小# 查看当前目录下各子目录大小按从大到小排序 du -sh * | sort -rh | head -20注意du和df结果不一致是正常的因为du统计的是文件实际块数df统计的是文件系统元数据。如果差距巨大通常就是上面说的deleted文件问题。IO 性能方面iostat是标配# 每2秒刷新一次共输出5次 iostat -x 2 5重点看%util和await。%util接近 100% 说明磁盘饱和await是平均等待时间毫秒机械盘超过 20ms、SSD 超过 5ms 就值得关注。我一般会配合iotop看具体是哪个进程在狂读写iotop -o -P-o只显示有 IO 的进程-P显示进程而不是线程输出更干净。2.3 系统整体状态vmstat和sar的妙用vmstat是我排查系统级瓶颈的利器vmstat 1 10 # procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- # r b swpd free buff cache si so bi bo in cs us sy id wa st # 2 0 0 1123456 45678 987654 0 0 12 34 567 890 5 2 92 1 0关键列r是运行队列长度持续大于 CPU 核心数说明 CPU 不够b是阻塞进程数大于 0 说明有 IO 等待si/so是 swap 换入换出非 0 说明内存压力大wa是 IO 等待百分比高说明磁盘慢。sar适合看历史趋势但需要提前开启数据收集。如果机器上没开临时排查用vmstat就够了。3. 文件与目录操作别只会ls和cd3.1 查找文件find的高级用法find是运维最常用的命令之一但很多人只会find / -name *.log。我常用的几个组合# 查找7天前的日志文件并删除 find /var/log -name *.log -mtime 7 -delete # 查找大于100M的文件 find / -type f -size 100M -exec ls -lh {} \; 2/dev/null # 查找最近1小时内修改过的文件 find /data -type f -mmin -60 # 按权限查找 find / -type f -perm 777 2/dev/null-mtime 7表示修改时间在 7 天前-mmin -60表示 60 分钟内。注意是大于-是小于没有符号是精确匹配。2/dev/null是为了屏蔽权限不足的报错不然输出会非常乱。注意-delete操作不可恢复建议先用-print确认结果再执行删除。我习惯先跑一遍不带-delete的确认列表没问题再加。3.2 文本处理三剑客grep、awk、sed这三个命令是日志分析的基石。grep的常用参数# 递归搜索并显示行号 grep -rn ERROR /var/log/app/ # 忽略大小写显示匹配行的前后2行 grep -i -C 2 timeout app.log # 反向匹配排除包含DEBUG的行 grep -v DEBUG app.log # 统计匹配行数 grep -c Exception app.logawk适合按列处理# 提取日志中的第1列和第7列 awk {print $1, $7} access.log # 按空格分割统计第9列状态码的出现次数 awk {print $9} access.log | sort | uniq -c | sort -rn # 条件过滤第9列等于500的行 awk $9 500 {print $0} access.logsed适合替换和删除# 将文件中的old替换为new直接修改原文件 sed -i s/old/new/g config.txt # 删除空行 sed -i /^$/d file.txt # 打印第10到20行 sed -n 10,20p file.txt这三个命令组合起来威力巨大。比如统计 Nginx 访问日志中访问量最高的 10 个 IPawk {print $1} access.log | sort | uniq -c | sort -rn | head -103.3 文件传输与同步scp、rsync、tar跨机器传文件scp最简单# 本地传到远程 scp -r ./dist user192.168.1.100:/var/www/ # 远程拉到本地 scp user192.168.1.100:/var/log/app.log ./但scp不支持断点续传大文件传输中断就得重来。所以超过 100M 的文件我一般用rsyncrsync -avzP --delete ./data/ user192.168.1.100:/backup/data/-a归档模式-v详细输出-z压缩传输-P显示进度并支持断点续传--delete删除目标端多余文件保持完全同步。这个命令我每天备份都在用稳得很。打包压缩方面tar是标配# 打包并压缩 tar -czvf backup.tar.gz /data/app/ # 解压 tar -xzvf backup.tar.gz -C /restore/ # 查看压缩包内容不解压 tar -tzvf backup.tar.gz-c创建-x解压-zgzip 压缩-v显示过程-f指定文件名。顺序不能乱-f必须紧挨着文件名。4. 进程与服务管理让服务乖乖听话4.1 进程查看与终止ps、kill、pkillps aux是最常用的进程查看命令但输出太长。我一般配合grepps aux | grep nginx | grep -v grepgrep -v grep是为了排除 grep 自身的进程。更好的方式是pgreppgrep -a nginx # 输出1234 nginx: master process /usr/sbin/nginx终止进程用killkill -15 1234 # 发送SIGTERM优雅退出 kill -9 1234 # 发送SIGKILL强制杀死注意永远优先用-15给进程清理资源的机会。-9是最后手段可能导致数据丢失或文件损坏。我见过有人上来就-9结果数据库文件损坏修了半天。批量杀进程用pkillpkill -f python manage.py runserver-f匹配完整命令行不加-f只匹配进程名。4.2 服务管理systemctl与journalctl现代 Linux 发行版基本都用systemd服务管理用systemctlsystemctl start nginx # 启动 systemctl stop nginx # 停止 systemctl restart nginx # 重启 systemctl reload nginx # 重载配置不中断服务 systemctl status nginx # 查看状态 systemctl enable nginx # 开机自启 systemctl disable nginx # 取消自启reload和restart的区别很关键reload只重新加载配置文件不中断现有连接restart是彻底停止再启动会断开所有连接。Nginx、MySQL 这类服务优先用reload。查看服务日志用journalctl# 查看nginx的日志 journalctl -u nginx -n 100 --no-pager # 实时跟踪 journalctl -u nginx -f # 查看今天的日志 journalctl -u nginx --since today-n 100显示最后 100 行--no-pager不分页直接输出-f实时跟踪。这些参数组合起来比翻/var/log/messages方便多了。4.3 后台运行与定时任务nohup、screen、crontab临时跑一个长时间任务又不想占着终端用nohupnohup python train.py train.log 21 train.log把标准输出重定向到文件21把标准错误也重定向过去让命令后台运行。这样即使关掉终端任务也不会停。但nohup的缺点是没法交互。如果需要交互式会话用screen或tmux# screen用法 screen -S mysession # 创建名为mysession的会话 # 按CtrlA然后按D分离会话 screen -ls # 列出所有会话 screen -r mysession # 重新连接tmux功能更强支持分屏但学习成本稍高。我一般用screen就够了。定时任务用crontab -e编辑# 每天凌晨3点备份数据库 0 3 * * * /usr/bin/mysqldump -u root -ppassword mydb /backup/mydb_$(date \%Y\%m\%d).sql # 每5分钟检查一次服务状态 */5 * * * * /usr/bin/systemctl is-active nginx || /usr/bin/systemctl restart nginx五个星号分别代表分、时、日、月、周。*/5表示每 5 分钟。注意%在 crontab 中需要转义为\%这个坑我踩过日期格式化一直不生效查了半天才发现。5. 网络诊断从连通性到抓包5.1 连通性测试ping、telnet、curlping是最基础的ping -c 4 8.8.8.8-c 4发 4 个包就停不然会一直 ping 下去。但很多服务器禁 ping所以ping不通不代表网络有问题。测试端口连通性用telnet或nctelnet 192.168.1.100 3306 nc -zv 192.168.1.100 3306nc -zv更干净-z只扫描不发送数据-v显示详细信息。curl是测试 HTTP 服务的利器# 显示响应头 curl -I https://example.com # 显示详细连接过程 curl -v https://example.com # 指定超时时间 curl --connect-timeout 5 --max-time 10 https://example.com # POST JSON数据 curl -X POST -H Content-Type: application/json -d {key:value} https://example.com/api-I只看响应头-v看完整握手过程排查 HTTPS 证书问题特别有用。5.2 端口与连接netstat、ss、lsofnetstat逐渐被ss取代但很多老机器还在用# 查看所有监听端口 netstat -tlnp # 查看所有TCP连接 netstat -anp | grep ESTABLISHED # ss的等价命令 ss -tlnp ss -anp | grep ESTABLISHED-tTCP-l监听-n不解析域名更快-p显示进程。ss比netstat快很多连接数多的时候差距明显。查看某个端口被哪个进程占用lsof -i :8080 # 或 ss -tlnp | grep 80805.3 抓包分析tcpdump入门tcpdump是网络排查的终极武器# 抓取eth0上80端口的包写文件 tcpdump -i eth0 -w capture.pcap port 80 # 抓取指定IP的包显示ASCII内容 tcpdump -i eth0 -A host 192.168.1.100 # 抓取10个包就停 tcpdump -i eth0 -c 10 port 443-i指定网卡-w写文件可以用 Wireshark 打开分析-A显示 ASCII 内容-c限制包数量。抓包文件可能很大建议加-c或-w配合-G按时间切割。注意生产环境抓包可能涉及敏感数据务必确认合规后再操作抓完及时删除文件。6. 日志分析从海量日志中挖出真相6.1 实时日志跟踪tail与multitailtail -f是最常用的tail -f /var/log/nginx/access.log但同时看多个日志文件multitail更方便multitail /var/log/nginx/access.log /var/log/nginx/error.log如果没装multitail可以用tail -f配合tail -f app.log tail -f error.log6.2 日志过滤与统计grep、awk、sort、uniq组合统计访问量最高的 URLawk {print $7} access.log | sort | uniq -c | sort -rn | head -20统计每分钟的请求数awk {print $4} access.log | cut -d: -f1,2 | uniq -c查找特定时间段的日志sed -n /2024-01-15 10:00/,/2024-01-15 11:00/p app.log这些组合技需要多练我建议拿自己机器的日志文件反复试形成肌肉记忆。6.3 日志切割与清理logrotate配置日志无限增长会撑爆磁盘logrotate是标准解决方案。配置文件在/etc/logrotate.d/下/var/log/myapp/*.log { daily rotate 7 compress delaycompress missingok notifempty create 0640 www-data www-data sharedscripts postrotate systemctl reload myapp /dev/null 21 || true endscript }daily每天切割rotate 7保留 7 份compress压缩旧日志delaycompress延迟压缩避免影响正在写入的日志missingok文件不存在不报错notifempty空文件不切割。postrotate里的脚本在切割后执行通知服务重新打开日志文件。这个配置我每个项目都会加不然磁盘迟早被日志撑满。7. 权限与用户管理安全的第一道门7.1 文件权限chmod、chown、umaskchmod设置权限chmod 755 script.sh # rwxr-xr-x chmod 644 config.txt # rw-r--r-- chmod x script.sh # 添加执行权限 chmod -R 755 /var/www/ # 递归设置数字含义4读2写1执行。755 是所有者读写执行组和其他人读执行。644 是所有者读写组和其他人只读。chown改所有者chown www-data:www-data /var/www/html/ chown -R user:group /data/umask决定新建文件的默认权限。默认umask 022新建文件权限是 644目录是 755。如果umask 027新建文件是 640目录是 750。生产环境建议umask 027更安全。7.2 用户与组管理useradd、usermod、passwd# 创建用户并指定家目录和shell useradd -m -s /bin/bash deploy # 设置密码 passwd deploy # 添加到sudo组 usermod -aG sudo deploy # 查看用户所属组 groups deploy-m自动创建家目录-s指定 shell-aG追加到附加组不加-a会覆盖原有组这个坑很危险。7.3 sudo配置visudo安全编辑直接编辑/etc/sudoers很危险用visudo会做语法检查visudo添加一行让deploy用户无需密码执行特定命令deploy ALL(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx只授予必要命令的权限比给全部 sudo 权限安全得多。8. 包管理与环境配置让软件安装不再头疼8.1 包管理器apt、yum、dnf对比Debian/Ubuntu 用aptapt update # 更新软件源 apt upgrade -y # 升级所有包 apt install nginx -y # 安装 apt remove nginx # 卸载 apt autoremove # 清理无用依赖CentOS/RHEL 用yum或dnfyum install nginx -y yum remove nginx yum updatednf是yum的下一代版本命令基本兼容但依赖解析更快。8.2 源码编译安装configure、make、make install有些软件包管理器里没有需要源码编译./configure --prefix/usr/local/nginx --with-http_ssl_module make -j$(nproc) make install--prefix指定安装路径-j$(nproc)用所有 CPU 核心并行编译速度大幅提升。编译前确保装了gcc、make、zlib-devel、openssl-devel等依赖。8.3 环境变量与PATH配置临时设置环境变量export PATH$PATH:/usr/local/bin永久生效写入~/.bashrc或/etc/profileecho export PATH$PATH:/usr/local/bin ~/.bashrc source ~/.bashrc/etc/profile对所有用户生效~/.bashrc只对当前用户生效。改完记得source一下不然当前会话不生效。9. 常见问题与排查技巧实录9.1 命令执行报错速查表报错信息常见原因解决方法Permission denied权限不足用sudo或chmod加权限Command not found命令未安装或不在PATH安装软件或检查PATHNo space left on device磁盘满df -h查磁盘清理文件Too many open files文件句柄数超限修改ulimit -n或/etc/security/limits.confConnection refused服务未启动或端口未监听ss -tlnp查端口启动服务Connection timed out网络不通或防火墙拦截ping、telnet测试检查防火墙规则Killed内存不足被OOM Killer杀掉dmesg9.2 我踩过的坑与独家技巧第一个坑rm -rf删错目录。我有个朋友在/下执行了rm -rf *整个系统报废。后来我养成了习惯删除前先pwd确认目录再用ls看一眼内容最后才执行删除。如果是重要操作先mv到/tmp而不是直接rm。第二个坑crontab里的命令不执行。原因通常是环境变量不同。crontab的 PATH 和登录 shell 不一样所以命令要用绝对路径或者在脚本开头source /etc/profile。第三个坑df和du结果不一致。前面说过是deleted文件占用。用lsof | grep deleted找到进程重启即可。第四个坑kill -9导致数据损坏。数据库、消息队列这类服务一定要先kill -15等它自己退出。如果等太久再考虑-9。第五个坑chmod -R 777解决一切权限问题。这是最危险的操作等于把系统大门敞开。正确的做法是找到具体是哪个文件权限不对针对性修改。9.3 效率提升alias与脚本把常用命令设成别名写入~/.bashrcalias llls -alh alias grepgrep --colorauto alias portsss -tlnp alias memfree -h alias diskdf -h alias ..cd .. alias ...cd ../..这样敲ll就等于ls -alh效率提升明显。对于重复性任务写成脚本#!/bin/bash # backup.sh - 备份数据库和网站目录 DATE$(date %Y%m%d) BACKUP_DIR/backup/$DATE mkdir -p $BACKUP_DIR mysqldump -u root -ppassword mydb $BACKUP_DIR/mydb.sql tar -czf $BACKUP_DIR/www.tar.gz /var/www/ find /backup -type d -mtime 7 -exec rm -rf {} \; echo Backup completed: $BACKUP_DIR加上执行权限放入crontab每天自动备份省心省力。10. 组合技与实战场景10.1 一键排查服务器状态脚本我把常用排查命令串成一个脚本新机器上手先跑一遍#!/bin/bash echo 系统负载 uptime echo 内存使用 free -h echo 磁盘使用 df -h echo CPU占用TOP5 ps aux --sort-%cpu | head -6 echo 内存占用TOP5 ps aux --sort-%mem | head -6 echo 监听端口 ss -tlnp echo 最近登录 last -n 5这个脚本 10 秒钟就能对服务器状态有个全面了解比一条条敲命令快多了。10.2 日志实时监控与告警用tail -f配合grep实时监控错误日志tail -f /var/log/app/error.log | grep --line-buffered ERROR | while read line; do echo [$(date)] $line # 这里可以加告警逻辑比如发邮件或调用webhook done--line-buffered确保 grep 实时输出不然会缓冲导致延迟。10.3 批量操作多台服务器如果有多台服务器用for循环批量执行for host in 192.168.1.101 192.168.1.102 192.168.1.103; do echo $host ssh user$host uptime free -h done更专业的做法是用ansible但临时排查用for循环就够了。11. 最后分享几个压箱底的小技巧CtrlR反向搜索历史命令输入关键词就能找到之前敲过的命令比按上箭头翻半天快得多。history | grep也可以但CtrlR更直接。!!重复上一条命令!$引用上一条命令的最后一个参数。比如mkdir /data/backup之后cd !$就直接进入/data/backup。CtrlZ挂起当前进程bg放到后台运行fg调回前台。临时需要跑个命令又不想开新终端时很有用。watch -n 2 command每 2 秒执行一次命令并刷新输出适合监控变化。比如watch -n 2 ss -tlnp | grep 8080监控端口状态。time command测量命令执行时间优化脚本时很有帮助。man和--help永远是最好的老师。遇到不熟悉的命令先man一下比搜索引擎快。这些命令和技巧我用了十多年至今每天都在用。服务器运维没有捷径就是多练、多踩坑、多总结。希望这套东西能帮你少走点弯路。
阅读完成 · 觉得有帮助?