Skip to content

Linux 自动化脚本:备份、crontab 与监控 ​

以下为未执行且彼此独立的教学片段。先核对源/目标、执行身份与恢复副本;完整的固定目录、互斥与失败处理见受限维护任务。

自动化脚本 ​

自动化脚本 ​

备份文件 ​

bash
#!/bin/bash

# 定义变量
backup_dir="/path/to/backup"
file_to_backup="/path/to/file.txt"

# 创建备份目录
mkdir -p "$backup_dir"

# 备份文件
backup_file="$backup_dir/$(date +%Y-%m-%d_%H-%M-%S)_file.txt"
copy_status=0
cp -- "$file_to_backup" "$backup_file" || copy_status=$?

# 显示备份结果
if [ "$copy_status" -eq 0 ]
then
    echo "File backup succeeded: $backup_file"
else
    echo "File backup failed." >&2
    exit 1
fi
bash
#!/bin/bash

# 定义备份目录和目标服务器地址
backup_dir="/data/backup"
target_server="user@target-server:/backup"

# --delete 会删除目标多余文件;先核对方向并用 --dry-run 审阅。
mkdir -p "$backup_dir/web" "$backup_dir/app" || exit 1
# 备份 Web 服务器文件
web_dir="/var/www/html"
rsync -avz --delete "$web_dir/" "$backup_dir/web/" || exit 1

# 备份应用程序文件
app_dir="/opt/myapp"
rsync -avz --delete "$app_dir/" "$backup_dir/app/" || exit 1

# 将备份数据同步到目标服务器
rsync -avz --delete "$backup_dir/" "$target_server" || exit 1
解释 ​

这个脚本会在指定的目录中创建一个新的备份文件,并将原始文件复制到该备份文件中。备份文件的文件名包括当前日期和时间,便于按时间区分;同一秒重跑仍可能重名,不能保证唯一或禁止覆盖。

你可以通过修改backup_dir和file_to_backup变量来自定义备份目录和要备份的文件路径。

当脚本执行完成时,它将会输出备份结果:如果备份文件成功创建,则显示成功消息及其文件名;否则,显示失败消息。

这只是一个基础的备份示例,你可以根据需要对其进行扩展和修改。例如,你可能希望增加一些错误检查或添加日志记录功能。

管理服务器 ​

Shell 脚本可以用来管理服务器上的自动化任务,例如定时运行脚本、自动化部署应用程序、监控服务状态等。

下面是一个简单的 Shell 脚本示例,用于管理定时任务:

原例以脚本覆盖 crontab、按正则删除命令,而且末尾立即移除了刚添加的任务,不作为操作流程。日后以目标用户运行 crontab -e,审阅后加入一条记录:

text
0 3 * * * /bin/bash /path/to/backup.sh

路径须替换为已核验的脚本。crontab -l 只列当前用户任务;撤销时只在编辑器删除本次那一条,保留其他行。另核对 cron 的环境、输出和脚本退出状态。

自动化任务 Shell 监控文件系统 ​

Shell 脚本可以用来监控文件系统,例如检查磁盘空间、监控日志文件等。下面是一个简单的 Shell 脚本示例,用于监控磁盘空间:

bash
#!/bin/bash

# 检查磁盘空间使用情况
check_disk_space() {
    local threshold=90  # 磁盘空间阈值

    # 获取当前磁盘空间使用率(取整数部分)
    local report usage
    report=$(df -P /) || return 2
    usage=$(printf '%s\n' "$report" | awk 'NR==2{gsub(/%/, "", $5); print $5}')
    case "$usage" in
        ''|*[!0-9]*) echo "无法读取磁盘使用率" >&2; return 2 ;;
    esac

    if [ "$usage" -gt "$threshold" ]; then
        echo "磁盘空间使用率超过阈值 ${threshold}%,当前使用率为 ${usage}%"
        return 1
    else
        echo "磁盘空间使用率正常,当前使用率为 ${usage}%"
        return 0
    fi
}

# 每隔 10 分钟检查一次磁盘空间
while true; do
    check_disk_space
    sleep 600
done

在这个脚本中,我们定义了一个函数 check_disk_space,用于检查磁盘空间使用情况,并将使用率与设定的阈值进行比较。如果使用率超过了阈值,则输出警告信息并返回错误码 1;否则输出正常信息并返回成功码 0。

然后,在主函数中,我们使用一个 while 循环来每次检查结束后等待 10 分钟,再调用 check_disk_space 函数来检查磁盘空间使用情况,并通过 sleep 命令实现定时检查。

需要注意的是,在实际使用中,还需要考虑一些其他因素,例如日志记录、警报通知等问题,以确保监控程序的可靠性和及时性。

docker build and push ​

以下是一个示例脚本,可以实现 Go 程序的 Docker 自动构建并推送到 Docker 仓库:

bash
#!/bin/bash

# 构建失败应立即停止,避免继续推送同名旧镜像。
set -eu
# 设置变量
IMAGE_NAME="your-image-name"
DOCKER_REPO="your-docker-repo"
TAG="latest"
DOCKERFILE_PATH="./Dockerfile"
CONTEXT="./"

# 构建镜像
docker build -t "${DOCKER_REPO}/${IMAGE_NAME}:${TAG}" -f "${DOCKERFILE_PATH}" "${CONTEXT}"

# 推送镜像到 Docker 仓库
docker push "${DOCKER_REPO}/${IMAGE_NAME}:${TAG}"

将以上脚本保存为名为 build-and-push.sh 的文件,在终端中运行此脚本即可自动构建和推送您的 Docker 镜像。请确保在脚本中替换 IMAGE_NAME 和 DOCKER_REPO 变量以反映您的实际情况。

Linux 定时备份与 crontab ​

将 /home/backups/balalala 归档到固定备份目录,再按文件名前缀清理历史归档。原稿先复制到临时目录再打包,步骤重复;直接归档源目录即可。对持续写入的数据库,应使用数据库一致性备份流程。

备份脚本 ​

sh

#!/bin/sh
set -eu
backup_dir=/home/backups/archive
mkdir -p "$backup_dir"
tar -czf "$backup_dir/backup-$(date +%Y%m%d).tar.gz" -C /home/backups balalala
find "$backup_dir" -type f -name "backup-*.tar.gz" -mtime +30 -delete

保存为 /home/backup.sh,先手动执行并检查归档内容与备份目录。find 的清理范围限定为该目录中匹配前缀的普通文件;-mtime +30 按完整 24 小时区间向下取整后比较,通常至少满 31 天才匹配;find 默认递归,目录内不得混入其他任务。日期归档同日重跑会覆盖,须先明确是否允许。

设置定时执行 ​

使用 crontab -e 编辑当前用户任务。五个时间字段依次是分钟、小时、日、月、星期;月份范围是 1–12。以下示例选择每周日零点执行:

text

0 0 * * 0 /bin/sh /home/backup.sh

原记录中的 0 0 /7 * /home/backup.sh 缺少字段,不能运行。每周执行与从某个起点严格间隔七天是不同需求;日期字段的步长也会随月份边界重置。使用前应按实际需求确定调度规则,并检查 crond 服务状态和任务输出。

继续阅读