调试服务器运维类 Shell 脚本,核心目标是快速定位问题、减少误操作和避免生产事故。下面从「基础习惯 → 调试手段 → 实战技巧 → 安全建议」四个层次讲。
#!/bin/bash
set -euo pipefail
-e:命令失败立即退出-u:使用未定义变量报错-o pipefail:管道中任意命令失败都算失败运维脚本强烈建议默认开启,避免“继续执行导致雪崩”
backup_mysql() {
...
}
clean_logs() {
...
}
好处:
bash -x 最常用bash -x script.sh
或脚本里加:
set -x
会显示:
适合:
echo / printf 打点(简单粗暴)echo "当前用户: $USER"
echo "备份目录: $BACKUP_DIR"
建议:
log() {
echo "[$(date +%F_%T)] $*"
}
: "${MYSQL_USER:?未设置 MYSQL_USER}"
command -v rsync >/dev/null || exit 1
bash -x script.sh --dry-run
或加参数:
DRY_RUN=1 ./script.sh
if [ "${DRY_RUN:-0}" -eq 1 ]; then
echo "模拟执行: rm -rf $DIR"
else
rm -rf "$DIR"
fi
find /var/log -name "*.log" -mtime +30 -print
# 确认无误再
find /var/log -name "*.log" -mtime +30 -delete
set -x + 日志文件exec > /var/log/script.log 2>&1
set -x
systemctl restart nginx
if [ $? -ne 0 ]; then
echo "nginx 重启失败"
exit 1
fi
或更好:
systemctl restart nginx || {
echo "nginx 重启失败"
exit 1
}
env | grep -E "PATH|HOME|USER"
服务器上常因:
cron 环境不全sudo 丢环境变量vim 改脚本并跑rm -rf $DIR/ 不加引号set -euo pipefail--dry-runread -p "确认删除 $DIR? y/N: " confirm
#!/bin/bash
set -euo pipefail
LOG=/var/log/ops.log
log() { echo "[$(date +%F_%T)] $*" | tee -a "$LOG"; }
backup() {
log "开始备份"
rsync -a /data/ /backup/ || exit 1
}
main() {
backup
log "完成"
}
main "$@"
如果你愿意,可以:
我可以直接帮你定位具体问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。