作为运维工程师,每天与Linux服务器打交道,熟练掌握常用命令是基本功。本文整理了50个实战中最常用的命令及技巧,帮你快速提升运维效率。
一、文件与目录管理
1. 快速查找大文件
服务器磁盘告警?先用这条命令找出占用空间最大的文件和目录:
# 查找当前目录下大于100MB的文件
find . -type f -size +100M -exec ls -lh {} \; | awk '{print $5, $9}'
# 查找系统中最占空间的10个目录
du -ah / --max-depth=1 2>/dev/null | sort -rh | head -n 10
2. 批量重命名文件
# 将所有 .txt 文件重命名为 .log
rename 's/\.txt$/.log/' *.txt
# 将所有文件名中的空格替换为下划线
find . -type f -name "* *" -exec rename 's/ /_/g' {} \;
# 批量添加前缀
for f in *.jpg; do mv "$f" "backup_$f"; done
3. 安全删除与恢复
危险操作前务必三思!建议用trash替代rm或将文件先移动到临时目录。
# 创建回收站别名(推荐添加到 ~/.bashrc)
alias trash='mv --target-directory=$HOME/.trash'
# 安全删除:先移动到临时目录,等30天后再确认删除
mkdir -p /tmp/safe_delete
mv old_logs/*.log /tmp/safe_delete/
# 彻底删除超过30天的临时文件
find /tmp/safe_delete -type f -mtime +30 -delete
二、进程与性能监控
4. 实时监控系统资源
# 实时CPU、内存、进程监控(按CPU占用排序)
top -c
# 每2秒刷新一次,指定刷新10次后退出
vmstat 2 10
# 详细查看某个进程(PID替换为实际值)
pidstat -p <PID> -u 1 5
# 监控磁盘I/O
iostat -xz 1 5
5. 快速定位CPU/内存消耗最高的进程
# CPU占用最高的10个进程
ps aux --sort=-%cpu | head -n 11
# 内存占用最高的10个进程
ps aux --sort=-%mem | head -n 11
# 快速杀死占用最高的进程(确认后再执行!)
ps aux --sort=-%cpu | awk 'NR==2 {print $2}' | xargs kill -15
# 查看某个用户的进程
ps -u username -f
6. 分析CPU飙升的根本原因
# 记录CPU使用率,排查间歇性飙升
nohup sh -c 'while true; do ps aux --sort=-%cpu | head -20 >> /tmp/cpu_log.txt; sleep 60; done' &
# 分析日志中导致CPU飙升的时段
grep -n "high cpu" /var/log/syslog | awk '{print $1, $2}' | head -20
# 查看进程树,快速定位父进程
pstree -p $(pgrep -f "problem_process")
三、网络诊断与排障
7. 全面网络诊断链
# 1. 检查网络接口状态
ip addr show
ip link show
# 2. 测试网络连通性(发3个包)
ping -c 3 8.8.8.8
# 3. 追踪路由(定位在哪一跳出问题)
traceroute -m 15 example.com
mtr -n example.com # 实时路由追踪
# 4. DNS解析检查
dig example.com
nslookup example.com
# 5. 检查端口是否开放
ss -tlnp | grep :80
netstat -tulnp | grep :443
8. 查看连接数和防御CC攻击
# 查看TCP连接数统计(按状态分类)
ss -s
# 查看与某个IP的连接数
ss -ant | awk '/:80\|:443/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
# 查看连接数最多的前20个IP
netstat -anp | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
# 封禁异常IP(替换为实际恶意IP)
iptables -A INPUT -s 1.2.3.4 -j DROP
# 封禁Ping(防止ICMP Flood)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
9. 端口转发与代理
# 将本机8080端口转发到远程服务器的80端口(通过SSH隧道)
ssh -L 8080:localhost:80 user@remote-server
# 将远程服务器的3306端口映射到本地
ssh -L 3307:localhost:3306 user@remote-server
# 使用socat做端口转发(后台运行)
nohup socat TCP-LISTEN:8080,fork TCP:192.168.1.100:80 &
# iptables端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
四、日志分析与安全
10. Nginx日志实时分析
# 实时查看最新日志
tail -f /var/log/nginx/access.log
# 统计HTTP状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 找出访问最频繁的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 统计每秒请求数(QPS)
awk '{print $4}' /var/log/nginx/access.log | cut -d: -f2,3,4 | sort | uniq -c | sort -rn | head -20
# 找出404最多的页面
awk '$9==404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
11. 系统安全检查清单
# 检查最近登录成功的用户
last | head -20
# 检查登录失败记录(排查暴力破解)
lastb | head -30
# 查看哪些用户有sudo权限
getent group sudo
# 检查开放的所有端口
nmap -p- -sT localhost
# 检查SSH是否被暴力破解
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -10
# 查找最近修改过的系统文件
find /bin /sbin /usr/bin /usr/sbin -mtime -7 -ls
五、定时任务与自动化
12. Crontab高效使用技巧
# 编辑当前用户定时任务
crontab -e
# 查看定时任务
crontab -l
# 系统级定时任务(/etc/crontab)
cat /etc/crontab
# 常用定时任务示例
# 每天凌晨2点执行数据库备份
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
# 每5分钟执行一次健康检查
*/5 * * * * /opt/scripts/health_check.sh
# 每周日凌晨3点清理临时文件
0 3 * * 0 find /tmp -type f -mtime +7 -delete
# 每月1日凌晨执行日志清理
0 0 1 * * /opt/scripts/clean_logs.sh
13. systemd定时器(推荐替代crontab)
# 创建定时器单元文件 /etc/systemd/system/backup.timer
cat > /etc/systemd/system/backup.timer << 'EOF'
[Unit]
Description=Database Backup Timer
[Timer]
OnCalendar=daily
AccuracySec=1min
[Install]
WantedBy=timers.target
EOF
# 创建对应的服务文件 backup.service
cat > /etc/systemd/system/backup.service << 'EOF'
[Unit]
Description=Database Backup Service
[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
[Install]
WantedBy=multi-user.target
EOF
# 启用并启动定时器
systemctl daemon-reload
systemctl enable backup.timer
systemctl start backup.timer
六、数据备份与恢复
14. MySQL数据库备份脚本
#!/bin/bash
# MySQL全量备份脚本
DB_HOST="localhost"
DB_USER="backup_user"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
mkdir -p ${BACKUP_DIR}
# 备份并压缩
mysqldump -h${DB_HOST} -u${DB_USER} -p${DB_PASS} --single-transaction --routines --triggers --events ${DB_NAME} | gzip > ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz
# 验证备份文件
if [ -s "${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz" ]; then
echo "[$(date)] Backup successful: ${DB_NAME}_${DATE}.sql.gz"
else
echo "[$(date)] Backup FAILED!" | mail -s "Backup Alert" admin@example.com
fi
# 清理旧备份
find ${BACKUP_DIR} -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete
echo "[$(date)] Old backups cleaned"
15. rsync远程同步备份
# 远程同步网站数据(保留权限和链接)
rsync -avz --delete -e "ssh -p 22 -i /root/.ssh/id_rsa" /var/www/html/ root@backup-server:/data/backup/www/
# 增量备份(只传差异部分)
rsync -avz --delete --delete-excluded /data/ root@backup-server:/data/backup/
# 排除特定目录或文件
rsync -avz --exclude='*.log' --exclude='tmp/' /data/website/ backup@192.168.1.200:/backup/
七、效率提升技巧
16. 历史命令的智慧用法
# 搜索之前用过的命令(非常实用!)
history | grep git
# 执行上一条命令(快速重复)
!!
# 执行包含"nginx"的历史命令
!nginx
# 使用Ctrl+R反向搜索(按TAB补全)
# 按Ctrl+R,然后输入关键字,重复按Ctrl+R切换
# 清除历史(登出前删除敏感命令)
history -c && exit
17. 一键生成服务器巡检报告
#!/bin/bash
# server_health_check.sh
echo "=========================================="
echo "服务器健康检查报告 - $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo ""
echo "【系统信息】"
uname -a
echo ""
echo "【运行时间】"
uptime
echo ""
echo "【磁盘使用】"
df -h | grep -v tmpfs
echo ""
echo "【内存使用】"
free -h
echo ""
echo "【Top5 CPU进程】"
ps aux --sort=-%cpu | head -6
echo ""
echo "【Top5内存进程】"
ps aux --sort=-%mem | head -6
echo ""
echo "【网络连接状态】"
ss -s
echo ""
echo "【最近重启记录】"
last reboot | head -5
echo ""
echo "【系统服务状态】"
systemctl list-units --type=service --state=failed
18. 快速环境变量管理
# 临时设置(当前会话有效)
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
# 永久设置(写入配置)
echo 'export JAVA_HOME=/usr/local/java' >> ~/.bashrc
source ~/.bashrc
# 查看所有环境变量
env | sort
# 查看特定变量
echo $PATH
# 从文件加载环境变量(.env文件)
set -a
source .env
set +a
总结
以上50个命令覆盖了Linux运维的日常核心场景。建议收藏本文作为速查手册,遇到问题时从对应的分类中快速定位解决方案。随着经验积累,你会发现这些命令的组合使用能解决80%以上的日常运维问题。
如有更多实战技巧,欢迎在评论区分享!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
















暂无评论内容