Linux 运维效率倍增计划——IT大叔私藏的 10 个 Shell 脚本实用技巧

兄弟们,今天聊点接地气的。运维这事儿,干久了…

兄弟们,今天聊点接地气的。运维这事儿,干久了你会发现,大部分时间其实不是在处理突发故障,而是在重复做同一件事——连上服务器,敲几行命令,看看状态,然后退出。我以前也是这样,直到我开始认真对待 Shell 脚本这件事。

别误会,我不是说要你成为 Bash 大师。但把日常巡检、日志清理、状态检查这些重复劳动写成脚本,让它们定时跑起来,你的效率直接翻倍。今天就掏掏我的私藏,10 个在生产环境跑了两年以上的实用 Shell 技巧和脚本片段,直接拿走就能用。

1. 一键系统健康巡检脚本

这应该是我用得最多的脚本。每天早上看一眼这个输出,心里就有底了:

#!/bin/bash
# server-health.sh —— 系统健康一分钟快检
echo "=== 系统负载 ==="
uptime
echo ""
echo "=== 内存 ==="
free -h | awk '/^Mem/ {print "总内存:", $2, "已用:", $3, "可用:", $4}'
echo ""
echo "=== 磁盘 ==="
df -h | grep -E '^(/dev/|overlay)' | awk '{print $1, $NF, $5, $3"/"$2}'
echo ""
echo "=== Docker 容器状态 ==="
docker ps -a --format "table {{.Names}}\t{{.Status}}" 2>/dev/null | head -20

把这个脚本加到 crontab 里,每天早上 8 点把结果推到你手机:

0 8 * * * /usr/local/bin/server-health.sh | mail -s "📊 服务器晨检报告" your-email@example.com

2. 日志轮转别等系统帮你

logrotate 是标配,但 Docker 容器的日志经常被忽略。下面这个脚本专门处理 Docker 容器的泛滥日志,每天凌晨自动跑:

#!/bin/bash
# docker-log-cleanup.sh
echo "=== 清理前容器日志大小 ==="
du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null
# 限制单个容器日志 10MB
find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 10M {} \;
echo "=== 清理后 ==="
du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null

注意:生产环境最好在 Docker Compose 里配 logging: max-size: "10m" max-file: "3",这个脚本只兜底用。

3. 磁盘告警——给自己留抢救时间

磁盘写满比服务挂了还致命,因为挂了你能立刻发现,磁盘满了往往是无声无息的。这个脚本检查所有分区,超过阈值就报警:

#!/bin/bash
# disk-alert.sh
THRESHOLD=85
df -h | grep -E '^(/dev/|overlay)' | while read line; do
  usage=$(echo $line | awk '{print $5}' | sed 's/%//')
  mount=$(echo $line | awk '{print $NF}')
  if [ "$usage" -ge "$THRESHOLD" ]; then
    echo "⚠️ 警告:$mount 使用率已达 ${usage}%"
    # 这里可以接 Telegram Bot API 推送
    # curl -s "https://api.telegram.org/bot$TOKEN/sendMessage?chat_id=$CHAT_ID&text=磁盘告警:$mount 使用率 ${usage}%"
  fi
done

4. 用 trap 写安全的脚本

很多人写脚本从来不考虑中断清理。如果脚本中间被打断(比如你按了 Ctrl+C),临时文件、挂载点、锁文件全都留在那里。养成好习惯:

#!/bin/bash
CLEANUP_FILE="/tmp/deploy-$$.lock"
trap "rm -f $CLEANUP_FILE; echo '脚本中断,已清理临时文件'; exit 1" INT TERM
touch $CLEANUP_FILE
# ... 你的核心逻辑 ...
rm -f $CLEANUP_FILE
echo "脚本正常结束"

5. tmux 一键恢复工作区

连上服务器第一件事:起一个 tmux 会话。但每次都手工分窗口太麻烦。把下面这段存成 tmux-dev 脚本:

#!/bin/bash
# 一键创建开发工作区
SESSION="dev"
tmux new-session -d -s $SESSION -n "monitor" "htop"
tmux new-window -t $SESSION -n "logs" "journalctl -f"
tmux new-window -t $SESSION -n "docker" "docker ps -a && docker stats --no-stream"
tmux new-window -t $SESSION -n "shell"
tmux select-window -t $SESSION:3
tmux attach -t $SESSION

连上服务器直接 ./tmux-dev,四个窗口已经帮你排好了:监控、日志、Docker 状态、命令行。效率拉满。

6. 找出最占磁盘的目录

排查磁盘爆满时,别一层层 cd + du,直接用这行:

du -sh /* 2>/dev/null | sort -rh | head -10

想深入查某个具体目录(比如 /var):

du -sh /var/* 2>/dev/null | sort -rh | head -15

这套组合拳十分钟内就能定位到罪魁祸首,不管它是 Docker overlay2 的残留层,还是某个日志文件膨胀到几个 G。

7. 一键备份关键配置文件

服务器爆炸不可怕,可怕的是炸完之后你连配置都找不回来。我习惯把关键配置定期打包扔到另一个分区或者冷备盘:

#!/bin/bash
# backup-config.sh
BACKUP_DIR="/backup/configs"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
tar czf "$BACKUP_DIR/server-configs-$DATE.tar.gz" \
  /etc/nginx \
  /etc/docker \
  /etc/ssh/sshd_config \
  /etc/systemd \
  /root/.ssh \
  /etc/crontab \
  /etc/hosts \
  /etc/resolv.conf
echo "配置已备份到: $BACKUP_DIR/server-configs-$DATE.tar.gz"
# 保留最近 30 天的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

8. 网络连通性批量检测

家里机器多了以后,经常需要确认各个节点之间的网络是不是通的。别手动 ping,用这个:

#!/bin/bash
# netcheck.sh
HOSTS=("8.8.8.8" "192.168.1.1" "10.0.0.2" "your-server.com")
for host in "${HOSTS[@]}"; do
  if ping -c 2 -W 2 $host &>/dev/null; then
    echo "✅ $host 可达"
  else
    echo "❌ $host 不可达"
  fi
done

9. 跨节点 SSH 免密与批量执行

当你手上有四五台机器的时候,逐台登录执行命令就是纯体力活。配好 SSH 密钥之后,用这个模板批量执行:

#!/bin/bash
# batch-exec.sh —— 批量执行命令
NODES=("node1.local" "node2.local" "node3.local")
CMD="uptime; free -h | grep Mem"
for node in "${NODES[@]}"; do
  echo "===== $node ====="
  ssh -o ConnectTimeout=5 "$node" "$CMD" 2>&1
  echo ""
done

配好 ~/.ssh/config 里的 Host 别名,这脚本就能帮你一键巡遍所有节点。配合前面第 1 条的健康检查脚本,每天的综合巡检一分钟搞定。

10. 善用别名,少敲一百行

最后一条最简单但也最容易被忽略——.bashrc 里配好别名:

# 加到 ~/.bashrc 里
alias ll='ls -alh --color=auto'
alias la='ls -A'
alias g='grep --color=auto'
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias dlog='docker logs -f --tail 50'
alias dprune='docker system prune -af --volumes'
alias dfh='df -h | grep -E "^(/dev/|overlay)"'
alias ports='ss -tlnp'
alias myip='curl -s ifconfig.me'
alias nodeboot='systemctl list-units --type=service --state=running | head -30'

重启 shell 后 dps 就能看容器状态,dlog 追最新日志,ports 查监听端口。省掉的敲击次数按万计。

写在最后

以上 10 条,没有一条是花架子。我自己的生产环境里,每天早上 8 点自动跑健康巡检,每 30 分钟检查磁盘告警,每天凌晨清理 Docker 日志,每个周末打包配置归档到冷备盘——全是用这些脚本拼出来的。

运维的终极状态不是你多能排查故障,而是故障发生之前你已经有了预案。把重复的事交给脚本,把精力留给真正需要你判断的问题。这才是 Linux 运维的打开方式。

你有自己的私藏脚本吗?评论区分享一下,让兄弟们都抄抄作业 😄

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注