“Linux命令那么多,到底该学哪些?怎么才能快速上手?”说实话,Linux命令确实浩如烟海,但真正在日常运维中高频使用的,也就几十个。今天这篇文章,我把十年积累的核心命令、实用技巧、故障排查方法论全部整理出来,手把手带你从“会用”到“精通”。
一、基础篇:这些命令,每天都会用到
1. 文件操作三剑客
ls - 查看文件
# 最常用组合ls -lh # 人性化显示大小,长格式ls -la # 显示所有文件(包括隐藏文件)ls -lt # 按修改时间排序ls -ltr # 按时间倒序(最新的在最后)# 实战技巧:查看目录下最大的10个文件ls -lhS | head -10
# 按名称查找find /var/log -name "*.log" -mtime -7 # 最近7天修改的日志# 按大小查找find / -size +100M -ls # 查找大于100M的文件# 按权限查找find / -perm 4000 -ls # 查找SUID文件(安全审计常用)# 批量操作(经典案例:清理7天前的日志)find /var/log/nginx/ -name "*.log" -mtime +7 -delete# 批量修改权限find . -type f -exec chmod 644 {} \; # 所有文件644find . -type d -exec chmod 755 {} \; # 所有目录755
# 打包压缩(最常用)tar -czf backup.tar.gz /path/to/dir # 压缩tar -xzf backup.tar.gz # 解压# 查看压缩包内容不解压tar -tzf backup.tar.gz | head -20# 排除某些目录打包tar -czf backup.tar.gz --exclude='logs' --exclude='cache' /app# 打包时保留权限和属性tar -czpf backup.tar.gz /etc # -p 保留权限
2. 文本处理三剑客(grep、awk、sed)
这是Linux运维的核心技能,掌握了它们,你处理日志的效率能提升10倍。
grep - 搜索文本
# 基础搜索grep "ERROR" app.log # 搜索ERRORgrep -i "error" app.log # 忽略大小写grep -r "error" /var/log/ # 递归搜索目录grep -E "ERROR|FATAL" app.log # 正则匹配多个关键词# 实战技巧:查看错误日志并显示前后5行grep -B 5 -A 5 "ERROR" app.log# 统计错误次数grep -c "ERROR" app.log# 排除某些行grep -v "DEBUG" app.log # 过滤掉DEBUG日志# 常用组合:查看实时日志中的错误tail -f app.log | grep --line-buffered "ERROR"
# 基础语法:awk '{print $N}' 打印第N列cat access.log | awk '{print $1}' # 打印第一列(通常是IP)cat access.log | awk '{print $4, $7}' # 打印时间和URL# 实战案例1:统计Nginx日志中访问量最高的IPawk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10# 实战案例2:统计HTTP状态码分布awk '{print $9}' access.log | sort | uniq -c | sort -rn# 实战案例3:计算平均响应时间(假设第10列是响应时间)awk '{sum+=$10; count++} END {print sum/count}' access.log# 条件过滤awk '$9 >= 500 {print $0}' access.log # 打印所有5xx错误的请求
# 替换文本(最常用)sed -i 's/old/new/g' file.txt # 全局替换sed -i 's/old/new/' file.txt # 只替换每行第一个# 实战:批量修改配置文件sed -i 's/192.168.1.100/192.168.1.200/g' config.properties# 删除行sed -i '/^$/d' file.txt # 删除空行sed -i '10d' file.txt # 删除第10行sed -i '10,20d' file.txt # 删除10-20行# 插入行sed -i '1i # This is a new header' file.txt # 在第1行前插入sed -i '$a # This is footer' file.txt # 在最后一行后插入
3. 系统状态监控
top/htop - 实时进程监控
top # 基础版# 在top中常用快捷键:# P - 按CPU排序# M - 按内存排序# 1 - 显示每个CPU核心# k - 杀掉进程htop # 增强版(需要安装)# 更友好的界面,支持鼠标操作
free -h # 人性化显示free -m # 以MB为单位# 重点关注available列(真实可用内存)# buffers/cache 是Linux的缓存机制,不用过度担心
df -h # 查看磁盘分区使用率df -i # 查看inode使用率(容易忽略!)# du:查看目录大小du -sh /var/log/ # 总大小du -sh /* | sort -rh | head -10 # 根目录下最大的10个目录du -sh * | sort -rh | head -10 # 当前目录下最大的10个文件/目录
# netstat(传统,需要安装net-tools)netstat -tlnp # 查看监听端口netstat -anp | grep ESTABLISHED | wc -l # 统计当前连接数# ss(现代,更快速)ss -tlnp # 查看监听端口ss -tan state established | wc -l # 统计已建立的连接数# 实战:查看哪个进程占用了80端口ss -tlnp | grep :80
iostat -x 1 5 # 每秒刷新,共5次# 重点关注:# %util - 磁盘使用率(超过80%说明IO瓶颈)# await - 平均等待时间(超过10ms说明有问题)
二、进阶篇:实战场景必备技能
4. 性能排查三板斧
CPU排查
# 1. 查看CPU整体情况top -c # 看哪个进程CPU高# 2. 查看CPU详细信息mpstat -P ALL 1 # 查看每个CPU核心的使用率# 3. 查看进程内线程CPU占用top -H -p <pid> # 查看指定进程的线程CPU# 4. 分析Java进程CPU高的原因(典型场景)# 先用top找到CPU高的进程pid# 再查看该进程的线程top -H -p 12345# 将线程ID转为16进制printf "%x\n" 12346# 用jstack导出线程堆栈jstack 12345 | grep -A 20 <16进制线程ID>
# 1. 查看内存整体情况free -h# 如果available很小,说明内存紧张# 2. 查看内存占用最高的进程ps aux --sort=-%mem | head -10# 3. 查看进程内存详情pmap -x <pid> # 详细内存映射cat /proc/<pid>/smaps | grep -i pss # 查看实际物理内存# 4. 检查内存泄漏(Java进程)jmap -heap <pid> # 查看堆内存使用jstat -gcutil <pid> 1000 10 # 每秒打印GC情况
# 1. 查看磁盘IO情况iostat -x 1# 2. 查看哪个进程在读写磁盘iotop -o # 只显示有IO的进程# 3. 查看文件系统读写情况pidstat -d 1 # 每秒打印进程IO统计# 4. 查找大量小文件目录(常见性能杀手)find /data -type f | cut -d/ -f2 | sort | uniq -c | sort -rn | head -10
5. 日志分析实战
实时追踪日志
# 基础实时查看tail -f app.log# 带高亮的实时查看(grep颜色)tail -f app.log | grep --color=auto ERROR# 多文件同时查看tail -f app1.log app2.log# 使用multitail(更强大,需要安装)multitail -l "tail -f app.log" -l "tail -f error.log"
# 统计每小时请求量awk '{print $4}' access.log | cut -d: -f2 | sort | uniq -c# 统计Top 10 URLawk '{print $7}' access.log | sort | uniq -c | sort -rn | head -10# 统计响应时间分布awk '{print $10}' access.log | awk '{if($1<100) count1++; else if($1<500) count2++; else count3++} END {print "slow:",count3,"normal:",count2,"fast:",count1}'# 分析某个时间段的日志sed -n '/2024-01-15 10:00/,/2024-01-15 11:00/p' app.log | grep ERROR
6. 网络排查实战
连接排查
# 1. 查看TCP连接状态ss -tan | awk '{print $1}' | sort | uniq -c# 2. 查看TIME_WAIT过多(常见问题)ss -tan | grep TIME_WAIT | wc -l# 解决方法:调整内核参数sysctl net.ipv4.tcp_tw_reuse=1sysctl net.ipv4.tcp_fin_timeout=30# 3. 追踪路由traceroute -n 8.8.8.8# 4. 测试端口连通性telnet 192.168.1.100 80nc -zv 192.168.1.100 80 # 更现代的方式# 5. 抓包分析tcpdump -i eth0 port 80 -w capture.pcap # 抓取80端口流量tcpdump -i eth0 host 192.168.1.100 -c 100 # 抓取指定IP的100个包tcpdump -i eth0 -A | grep "GET" # 实时查看HTTP请求
# 1. DNS解析测试dig google.comnslookup google.com# 2. 查看DNS缓存(systemd-resolved)resolvectl statistics# 3. 清空DNS缓存systemd-resolve --flush-caches
三、系统调优篇:让Linux跑得更快
7. 内核参数优化
文件句柄限制
# 查看当前限制ulimit -n# 临时修改ulimit -n 65535# 永久修改(/etc/security/limits.conf)* soft nofile 65535* hard nofile 65535# 查看进程打开的文件lsof -p <pid> | wc -l
TCP参数优化(/etc/sysctl.conf)# 高并发场景必备net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_max_tw_buckets = 5000net.ipv4.tcp_max_syn_backlog = 8192net.ipv4.tcp_syn_retries = 2net.ipv4.tcp_synack_retries = 2# 生效配置sysctl -p
8. 定时任务与自动化
Crontab配置
# 编辑定时任务crontab -e# 定时任务格式# * * * * * command# 分 时 日 月 周# 常用示例0 2 * * * /scripts/backup.sh # 每天凌晨2点执行*/5 * * * * /scripts/health_check.sh # 每5分钟执行0 9 * * 1 /scripts/weekly_report.sh # 每周一上午9点@reboot /scripts/startup.sh # 重启时执行# 查看定时任务crontab -l# 定时任务日志tail -f /var/log/cron
#!/bin/bash# 脚本头部模板set -e # 遇到错误立即退出set -u # 使用未定义变量时报错# 定义日志函数log_info() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1"}log_error() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" >&2}# 使用示例log_info "Starting backup..."# 执行操作if [ $? -eq 0 ]; then log_info "Backup completed"else log_error "Backup failed" exit 1fi
四、安全篇:这些配置必须做
9. SSH安全加固
# /etc/ssh/sshd_config 关键配置PermitRootLogin no # 禁止root直接登录PasswordAuthentication no # 禁用密码登录,只使用密钥Port 22222 # 修改默认端口(可选)MaxAuthTries 3 # 最大认证尝试次数ClientAliveInterval 60 # 保持连接ClientAliveCountMax 3# 重启SSHsystemctl restart sshd
10. 防火墙配置
# firewalld(CentOS/RHEL)firewall-cmd --zone=public --add-port=80/tcp --permanentfirewall-cmd --zone=public --add-service=ssh --permanentfirewall-cmd --reloadfirewall-cmd --list-all# iptables(通用)iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A INPUT -j DROP
五、故障排查实战案例
案例1:CPU突然飙升到100%
现象:服务器响应变慢,top看到CPU 100%
排查步骤:
# 1. 找到高CPU进程top -c# 发现进程PID 12345 CPU占用80%# 2. 查看该进程的线程top -H -p 12345# 发现线程12346 CPU占用70%# 3. 查看该线程的堆栈printf "%x\n" 12346 # 输出 0x303ajstack 12345 | grep -A 30 "0x303a"# 4. 发现线程在死循环,定位到代码行# 修复代码后重启服务
案例2:磁盘空间满了,但找不到大文件
现象:df -h 显示 / 使用率100%,但 du -sh /* 加起来远小于总大小
排查步骤:
# 1. 检查是否有已删除但未释放的文件lsof | grep deleted | grep -v "perl|python"# 发现有文件被删除,但进程还在占用# 2. 查看占用进程lsof -n | grep deleted | awk '{print $2}' | sort -u | xargs ps -fp# 3. 重启占用进程或清空文件> /proc/<pid>/fd/数字 # 清空文件描述符# 4. 再次检查df -h
案例3:Nginx出现大量TIME_WAIT
现象:ss -tan | grep TIME_WAIT | wc -l 显示几万个TIME_WAIT
排查步骤:
# 1. 查看当前TCP参数sysctl net.ipv4.tcp_tw_reusesysctl net.ipv4.tcp_tw_recycle # 注意:已废弃,不要再使用# 2. 优化参数echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.confecho "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.confsysctl -p# 3. 检查短连接是否过多ss -tan | grep ESTABLISHED | wc -l# 4. 考虑使用长连接(在Nginx配置中)# upstream中配置keepaliveupstream backend { keepalive 32;}
让工作更高效的技巧
# 1. 使用别名简化常用命令alias ll='ls -alh'alias gs='git status'alias nginx-reload='nginx -s reload'# 2. 后台运行与持久化nohup ./long_task.sh > output.log 2>&1 & # 后台运行,关闭终端不影响disown # 将作业从shell中剥离# 3. 屏幕复用(tmux)tmux new -s work # 创建新会话tmux attach -t work # 重新连接Ctrl + b, d # 分离会话Ctrl + b, % # 垂直分屏Ctrl + b, " # 水平分屏
Linux运维是一门需要持续积累的手艺。命令背得再多,不如亲手敲一遍;文档看得再多,不如亲手处理一次故障。
我的建议是:
搭建一套自己的实验环境(虚拟机或云服务器),大胆尝试
每天学一条新命令,坚持一个月,你会发现质的变化
遇到问题先看日志,80%的问题日志里都有答案
不要只满足于能用,多问一句“为什么这样写”
最后,送大家一句话:运维最大的敌人不是技术,而是“我以为”。