一键脚本
- 免交互式 默认备份到
/vol2/1000/file/backup/2panel-backup,保留 6 份
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/2panel_backup.sh) "/vol2/1000/file/backup/2panel-backup" 6
bash <(curl -sL ../sh/2panel_backup.sh) 6 "/vol2/1000/file/backup/2panel-backup"
| 用法 | 命令 | 说明 |
|---|---|---|
| 使用默认 | ./2panel_backup.sh |
备份到默认目录,保留 6 份 |
| 只传保留份数 | ./2panel_backup.sh 10 |
自定义保留 10 份 |
| 只传备份目录 | ./2panel_backup.sh /data/bak |
自定义备份目录,保留 6 份 |
| 目录 + 保留数 | ./2panel_backup.sh /data/bak 8 |
自定义目录与保留数量 |
| 顺序互换 | ./2panel_backup.sh 8 /data/bak |
保留数在前,顺序兼容 |
效果预览
补充说明
该脚本用于 2Panel 服务数据一键备份,流程为:停止 2panel systemd 服务 → 使用 2panel backup 命令打包生成 zip 备份文件(文件名精确到秒)→ 按保留数量自动清理过期备份 → 重新启动服务并校验状态。
功能特点
- 免交互设计:无需任何输入,适合配合 crontab / 1panel 计划任务定时执行
- 参数兼容:支持「目录」「保留数」两种参数互换,
./2panel_backup.sh 8 /data/bak与./2panel_backup.sh /data/bak 8效果相同 - 秒级时间戳:备份文件名格式为
2Panel-YYYY-MM-DD_HH-MM-SS.zip,避免同名覆盖 - 自动清理:扫描备份目录中
2Panel-*.zip文件,按时间排序保留最新 N 份,删除过期文件 - 服务自愈:备份完成后自动重启 2panel 服务,并检测服务状态给出明确提示
- 彩色日志:保存目录、保留数量、执行过程、删除列表均彩色高亮输出
- 默认安全:默认保留 6 份备份,防止意外删除
输出说明
脚本输出包含以下内容:
| 字段 | 说明 |
|---|---|
| 保存目录 | 备份文件存放路径 |
| 保留数量 | 设置的保留备份份数(默认 6) |
| 执行备份 | 正在生成的备份文件完整路径 |
| 删除列表 | 将要删除的过期备份文件列表 |
| 服务状态 | 重启后 2panel 服务运行状态(运行中/已停止/启动失败) |
注意事项
- 需要 root 权限执行,脚本依赖
systemctl停止/启动 2panel 服务 - 依赖 2Panel 自带的
2panel backup命令,版本需支持该子命令 - 备份目录需有写权限,脚本会自动
mkdir -p创建目录 - 备份期间 2panel 服务会短暂停机,请避开业务高峰时段
- 默认备份目录
/vol2/1000/file/backup/2panel-backup可根据实际环境传参覆盖 - 文件名采用新格式
2Panel-YYYY-MM-DD_HH-MM-SS.zip,旧格式2Panel_YYYYMMDD_HHMMSS.zip不参与清理匹配 - 清理逻辑基于文件名时间戳排序,确保删除的是最旧的备份
- 建议配合定时任务(crontab / 1panel 计划任务)每日执行一次
定时任务示例
# 下载脚本到系统目录
curl -fsSL https://gitee.com/meimolihan/cmdbox/raw/master/sh/2panel_backup.sh -o /usr/local/bin/2panel_backup
# 增加执行权限
chmod +x /usr/local/bin/2panel_backup
# 追加定时任务(防重复追加)
(crontab -l 2>/dev/null | grep -Fq '/usr/local/bin/2panel_backup /vol2/1000/file/backup/2panel-backup 6') || (crontab -l 2>/dev/null; echo '30 2 * * * /usr/local/bin/2panel_backup /vol2/1000/file/backup/2panel-backup 6 >> /var/log/2panel_backup.log 2>&1') | crontab -
# Linux 定时任务 美化列表
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/lx_cron_list.sh)
# 查看日志
cat /var/log/2panel_backup.log
脚本源码
#!/bin/bash
set -uo pipefail
gl_hui='\033[38;5;59m'
gl_hong='\033[38;5;9m'
gl_lv='\033[38;5;10m'
gl_huang='\033[38;5;11m'
gl_lan='\033[38;5;32m'
gl_bai='\033[38;5;15m'
gl_zi='\033[38;5;13m'
gl_bufan='\033[38;5;14m'
BACKUP_DIR="/vol2/1000/file/backup/2panel-backup"
KEEP_NUM=6
BIN_2PANEL="/usr/local/bin/2panel"
if [[ ! -x "${BIN_2PANEL}" ]];then
echo -e "${gl_hong}❌ 错误:2panel二进制不存在或无执行权限 ${BIN_2PANEL}${gl_bai}"
exit 1
fi
parse_args() {
local p1="${1:-}"
local p2="${2:-}"
if [[ -z "${p1}" ]]; then
return
fi
if [[ "${p1}" =~ ^[0-9]+$ ]]; then
KEEP_NUM="${p1}"
if [[ -n "${p2}" ]]; then
BACKUP_DIR="${p2}"
fi
else
BACKUP_DIR="${p1}"
if [[ -n "${p2}" && "${p2}" =~ ^[0-9]+$ ]]; then
KEEP_NUM="${p2}"
fi
fi
}
parse_args "$@"
echo -e ""
echo -e "${gl_zi}>>> 备份 2Panel${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
echo -e "${gl_huang}保存目录:${gl_lv}${BACKUP_DIR}${gl_bai}"
echo -e "${gl_huang}保留数量:${gl_lv}${KEEP_NUM}${gl_bai}"
NOW=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_FILE="${BACKUP_DIR}/2Panel-${NOW}.zip"
mkdir -p "${BACKUP_DIR}"
echo -e ""
echo -e "${gl_huang}>>> 停止 2panel 服务${gl_bai}"
systemctl stop 2panel
echo -e ""
echo -e "${gl_lan}>>> 执行备份:${BACKUP_FILE}${gl_bai}"
if ! "${BIN_2PANEL}" backup "${BACKUP_FILE}"; then
echo -e "${gl_hong}❌ 备份命令执行失败!不执行清理,退出脚本${gl_bai}"
systemctl start 2panel
exit 1
fi
cd "${BACKUP_DIR}" || exit 1
old_files=$(find . -maxdepth 1 -type f -name "2Panel-*.zip" -printf "%f\n" \
| sed -E 's/^2Panel-([0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2})\.zip$/\1 &/' \
| sort -k1,1 \
| head -n -${KEEP_NUM} \
| awk '{print $2}')
if [[ -n "${old_files}" ]];then
echo -e ""
echo -e "${gl_hong}>>> 将删除过期备份文件:${gl_bai}"
echo "${old_files}"
echo "${old_files}" | xargs -I {} rm -f "./{}"
else
echo -e ""
echo -e "${gl_lv}>>> 无过期备份需要删除${gl_bai}"
fi
echo -e ""
echo -e "${gl_lan}>>> 当前备份目录下全部有效备份文件(时间升序):${gl_bai}"
ALL_BACKUPS=$(find "${BACKUP_DIR}" -maxdepth 1 -type f -name "2Panel-*.zip" -printf "%f\n" | sort)
if [[ -z "${ALL_BACKUPS}" ]];then
echo -e "${gl_huang} 暂无备份文件${gl_bai}"
else
echo "${ALL_BACKUPS}" | while read -r fname; do
echo -e " ${fname}"
done
fi
echo -e ""
echo -e "${gl_huang}>>> 启动 2panel 服务${gl_bai}"
systemctl start 2panel
sleep 2
STATUS=$(systemctl is-active 2panel)
case "${STATUS}" in
active)
echo -e "${gl_lv}✅ 服务状态:运行中${gl_bai}"
;;
inactive)
echo -e "${gl_hong}❌ 服务状态:已停止${gl_bai}"
;;
failed)
echo -e "${gl_hong}❌ 服务状态:启动失败${gl_bai}"
;;
*)
echo -e "${gl_huang}⚠️ 服务状态:${STATUS}${gl_bai}"
;;
esac
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
创建本地脚本
new_script="new_test.sh"
cat > "$new_script" << 'EOF'
#!/bin/bash
# 粘贴脚本源码
EOF
# 保留本地脚本,去掉 rm -f "$new_script"
chmod +x "$new_script" && ./"$new_script" && rm -f "$new_script"