上一篇 下一篇 分享链接 返回 返回顶部

Debian 自动化实战:从备份、巡检到部署的一套脚本方案

发布人:慈云数据-客服中心 发布时间:9小时前 阅读量:4

Debian 工作流自动化教程|附源码

在日常开发、运维和个人效率管理中,Debian 是一个非常适合做自动化工作流的平台。它稳定、轻量、软件源丰富,并且拥有成熟的 Shell、systemd、cron、Python、Ansible 等工具生态。无论你是想自动备份文件、定时拉取代码、批量处理日志、部署服务,还是构建一套服务器巡检系统,Debian 都能提供非常可靠的基础环境。

本文将以“从零搭建 Debian 自动化工作流”为主线,介绍如何在 Debian 系统中使用 Shell 脚本、cron 定时任务、systemd 服务、Python 脚本以及日志管理工具来完成常见自动化任务。文章中会附带完整源码,方便你直接复制、修改和使用。


一、什么是 Debian 工作流自动化?

所谓工作流自动化,就是把原本需要人工重复执行的操作,用脚本、定时任务或服务的方式自动完成。

例如:

  • 每天凌晨自动备份网站目录;
  • 每小时检查服务器磁盘使用率;
  • 自动清理 7 天前的日志文件;
  • 自动拉取 Git 仓库并部署项目;
  • 服务异常时自动重启;
  • 定期生成系统状态报告;
  • 批量压缩、转存、同步文件。

这些任务如果每天手动执行,不仅浪费时间,而且容易出错。通过自动化,我们可以让 Debian 在后台按照预设规则稳定运行,大大提升效率和可靠性。


二、准备 Debian 自动化环境

本文示例基于 Debian 12,但 Debian 11、Debian 10 也基本适用。

首先更新软件源:

sudo apt update
sudo apt upgrade -y

安装常用工具:

sudo apt install -y \
  curl \
  wget \
  git \
  vim \
  htop \
  tree \
  unzip \
  zip \
  rsync \
  cron \
  jq \
  python3 \
  python3-pip

确认 cron 服务已启用:

sudo systemctl enable cron
sudo systemctl start cron
sudo systemctl status cron

创建一个专门存放自动化脚本的目录:

mkdir -p ~/automation/scripts
mkdir -p ~/automation/logs
mkdir -p ~/automation/backups

建议目录结构如下:

automation/
├── backups/
├── logs/
└── scripts/

其中:

  • scripts:存放自动化脚本;
  • logs:存放脚本运行日志;
  • backups:存放备份文件。

三、Shell 脚本自动备份目录

备份是最常见的自动化任务之一。下面我们写一个脚本,用于自动备份指定目录,并保留最近 7 天的备份文件。

假设我们要备份 /var/www/html 目录。

创建脚本:

vim ~/automation/scripts/backup_web.sh

写入以下内容:

#!/bin/bash

# ==============================
# Debian 自动备份脚本
# 功能:备份网站目录,并清理过期备份
# 作者:YourName
# ==============================

set -e

SOURCE_DIR="/var/www/html"
BACKUP_DIR="$HOME/automation/backups"
LOG_FILE="$HOME/automation/logs/backup_web.log"
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="web_backup_${DATE}.tar.gz"
RETENTION_DAYS=7

mkdir -p "$BACKUP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"

echo "[$(date '+%F %T')] 开始备份:$SOURCE_DIR" >> "$LOG_FILE"

if [ ! -d "$SOURCE_DIR" ]; then
  echo "[$(date '+%F %T')] 错误:源目录不存在:$SOURCE_DIR" >> "$LOG_FILE"
  exit 1
fi

tar -czf "$BACKUP_DIR/$BACKUP_FILE" "$SOURCE_DIR" 2>> "$LOG_FILE"

echo "[$(date '+%F %T')] 备份完成:$BACKUP_DIR/$BACKUP_FILE" >> "$LOG_FILE"

find "$BACKUP_DIR" -name "web_backup_*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete

echo "[$(date '+%F %T')] 已清理 $RETENTION_DAYS 天前的旧备份" >> "$LOG_FILE"
echo "----------------------------------------" >> "$LOG_FILE"

赋予执行权限:

chmod +x ~/automation/scripts/backup_web.sh

手动运行测试:

~/automation/scripts/backup_web.sh

查看日志:

cat ~/automation/logs/backup_web.log

这个脚本做了几件事:

  1. 检查备份源目录是否存在;
  2. 使用 tar -czf 打包压缩;
  3. 将运行状态写入日志文件;
  4. 删除超过 7 天的旧备份。

四、使用 cron 定时执行备份

脚本写好后,我们希望它每天凌晨 2 点自动执行。可以使用 Debian 自带的 cron。

编辑当前用户的 crontab:

crontab -e

添加:

0 2 * * * /home/youruser/automation/scripts/backup_web.sh

注意把 youruser 替换成你的实际用户名。

cron 表达式含义如下:

分 时 日 月 星期 命令
0  2  *  *  *    每天 02:00 执行

如果你想每小时执行一次:

0 * * * * /home/youruser/automation/scripts/backup_web.sh

如果你想每 10 分钟执行一次:

*/10 * * * * /home/youruser/automation/scripts/backup_web.sh

查看当前用户定时任务:

crontab -l

查看 cron 日志:

grep CRON /var/log/syslog

如果 Debian 没有 /var/log/syslog,可以安装 rsyslog:

sudo apt install -y rsyslog
sudo systemctl enable rsyslog
sudo systemctl start rsyslog

五、自动清理日志文件

服务器运行久了之后,日志文件会越来越多,尤其是开发测试环境,经常会出现日志占满磁盘的情况。下面写一个自动清理日志的脚本。

创建脚本:

vim ~/automation/scripts/clean_logs.sh

源码如下:

#!/bin/bash

# ==============================
# 日志自动清理脚本
# 功能:删除指定目录中超过指定天数的日志文件
# ==============================

set -e

LOG_DIR="$HOME/automation/logs"
SYSTEM_LOG_DIR="/var/log"
REPORT_FILE="$HOME/automation/logs/clean_logs_report.log"
RETENTION_DAYS=14

mkdir -p "$LOG_DIR"

echo "[$(date '+%F %T')] 开始清理日志" >> "$REPORT_FILE"

# 清理用户自动化日志
find "$LOG_DIR" -type f -name "*.log" -mtime +$RETENTION_DAYS -print -delete >> "$REPORT_FILE" 2>&1

# 示例:只打印系统日志中超过 30 天的文件,不直接删除
echo "[$(date '+%F %T')] 以下是系统日志中超过 30 天的文件:" >> "$REPORT_FILE"
find "$SYSTEM_LOG_DIR" -type f -mtime +30 -print >> "$REPORT_FILE" 2>&1 || true

echo "[$(date '+%F %T')] 日志清理完成" >> "$REPORT_FILE"
echo "----------------------------------------" >> "$REPORT_FILE"

赋权并运行:

chmod +x ~/automation/scripts/clean_logs.sh
~/automation/scripts/clean_logs.sh

配置每周日凌晨 3 点执行:

crontab -e

添加:

0 3 * * 0 /home/youruser/automation/scripts/clean_logs.sh

这里建议注意:系统日志不要随意删除,Debian 本身有 logrotate 管理日志轮转。如果你想管理系统日志,应优先配置 logrotate,而不是直接用 rm 删除。


六、使用 logrotate 管理日志轮转

如果你的自动化脚本会长期产生日志,建议使用 logrotate 进行日志轮转。它可以自动压缩旧日志、限制保留数量,并避免单个日志文件无限增大。

创建配置文件:

sudo vim /etc/logrotate.d/automation

写入:

/home/youruser/automation/logs/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    dateext
    create 0644 youruser youruser
}

参数说明:

  • daily:每天轮转;
  • rotate 7:保留 7 份;
  • compress:压缩旧日志;
  • missingok:日志不存在时不报错;
  • notifempty:空日志不处理;
  • dateext:文件名带日期;
  • create:轮转后创建新日志文件。

测试配置:

sudo logrotate -d /etc/logrotate.d/automation

强制执行:

sudo logrotate -f /etc/logrotate.d/automation

七、自动检查磁盘空间并报警

磁盘空间不足是服务器常见问题。我们可以写一个脚本,当磁盘使用率超过阈值时输出报警日志,后续也可以扩展成邮件、企业微信、钉钉或 Telegram 通知。

创建脚本:

vim ~/automation/scripts/check_disk.sh

源码如下:

#!/bin/bash

# ==============================
# 磁盘空间检查脚本
# 功能:当磁盘使用率超过阈值时记录报警
# ==============================

set -e

THRESHOLD=80
LOG_FILE="$HOME/automation/logs/disk_alert.log"

mkdir -p "$(dirname "$LOG_FILE")"

echo "[$(date '+%F %T')] 开始检查磁盘空间" >> "$LOG_FILE"

df -hP | awk 'NR>1 {print $1, $5, $6}' | while read -r filesystem usage mountpoint; do
  percent=${usage%\%}

  if [ "$percent" -ge "$THRESHOLD" ]; then
    echo "[$(date '+%F %T')] 警告:$mountpoint 使用率 ${usage},文件系统:$filesystem" >> "$LOG_FILE"
  else
    echo "[$(date '+%F %T')] 正常:$mountpoint 使用率 ${usage}" >> "$LOG_FILE"
  fi
done

echo "----------------------------------------" >> "$LOG_FILE"

赋权:

chmod +x ~/automation/scripts/check_disk.sh

运行:

~/automation/scripts/check_disk.sh

配置每小时检查一次:

0 * * * * /home/youruser/automation/scripts/check_disk.sh

如果你想把报警推送到 Webhook,可以继续扩展:

curl -X POST "https://example.com/webhook" \
  -H "Content-Type: application/json" \
  -d '{"msg":"磁盘空间不足"}'

八、使用 Python 自动生成系统报告

Shell 脚本适合做系统命令编排,但如果需要更清晰的数据结构、JSON 输出、HTTP 请求或复杂逻辑,Python 会更加方便。

下面写一个 Python 脚本,用于生成系统状态报告,包括 CPU、内存、磁盘和系统负载。

安装依赖:

pip3 install psutil

如果 Debian 提示不建议全局安装 pip 包,可以使用虚拟环境:

sudo apt install -y python3-venv
python3 -m venv ~/automation/venv
source ~/automation/venv/bin/activate
pip install psutil

创建脚本:

vim ~/automation/scripts/system_report.py

源码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Debian 系统状态报告脚本
功能:
1. 获取 CPU 使用率
2. 获取内存使用情况
3. 获取磁盘使用情况
4. 获取系统负载
5. 输出为文本报告
"""

import os
import time
import socket
import psutil
from datetime import datetime

BASE_DIR = os.path.expanduser("~/automation")
REPORT_DIR = os.path.join(BASE_DIR, "logs")
REPORT_FILE = os.path.join(REPORT_DIR, "system_report.log")


def bytes_to_gb(value):
    return round(value / 1024 / 1024 / 1024, 2)


def write_line(content):
    with open(REPORT_FILE, "a", encoding="utf-8") as f:
        f.write(content + "\n")


def main():
    os.makedirs(REPORT_DIR, exist_ok=True)

    hostname = socket.gethostname()
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    cpu_percent = psutil.cpu_percent(interval=1)
    memory = psutil.virtual_memory()
    disk = psutil.disk_usage("/")
    load_avg = os.getloadavg()

    write_line("=" * 50)
    write_line(f"报告时间:{now}")
    write_line(f"主机名称:{hostname}")
    write_line(f"CPU 使用率:{cpu_percent}%")
    write_line(
        f"内存:总计 {bytes_to_gb(memory.total)}GB,"
        f"已用 {bytes_to_gb(memory.used)}GB,"
        f"使用率 {memory.percent}%"
    )
    write_line(
        f"根分区:总计 {bytes_to_gb(disk.total)}GB,"
        f"已用 {bytes_to_gb(disk.used)}GB,"
        f"使用率 {disk.percent}%"
    )
    write_line(
        f"系统负载:1分钟 {load_avg[0]},"
        f"5分钟 {load_avg[1]},"
        f"15分钟 {load_avg[2]}"
    )
    write_line("=" * 50)
    write_line("")


if __name__ == "__main__":
    main()

赋权运行:

chmod +x ~/automation/scripts/system_report.py
~/automation/venv/bin/python ~/automation/scripts/system_report.py

加入 cron,每天早上 8 点生成报告:

0 8 * * * /home/youruser/automation/venv/bin/python /home/youruser/automation/scripts/system_report.py

九、自动拉取 Git 仓库并部署项目

对于开发者来说,自动部署也是非常实用的自动化场景。假设你的项目位于:

/var/www/myapp

我们希望脚本完成以下操作:

  1. 进入项目目录;
  2. 拉取最新代码;
  3. 安装依赖;
  4. 重启服务;
  5. 记录部署日志。

创建脚本:

sudo vim /usr/local/bin/deploy_myapp.sh

源码如下:

#!/bin/bash

# ==============================
# 自动部署脚本
# 功能:拉取 Git 代码并重启服务
# ==============================

set -e

APP_DIR="/var/www/myapp"
SERVICE_NAME="myapp"
LOG_FILE="/var/log/deploy_myapp.log"
BRANCH="main"

echo "[$(date '+%F %T')] 开始部署项目" >> "$LOG_FILE"

if [ ! -d "$APP_DIR/.git" ]; then
  echo "[$(date '+%F %T')] 错误:$APP_DIR 不是 Git 仓库" >> "$LOG_FILE"
  exit 1
fi

cd "$APP_DIR"

echo "[$(date '+%F %T')] 当前分支:" >> "$LOG_FILE"
git branch --show-current >> "$LOG_FILE" 2>&1

echo "[$(date '+%F %T')] 拉取最新代码" >> "$LOG_FILE"
git fetch origin >> "$LOG_FILE" 2>&1
git checkout "$BRANCH" >> "$LOG_FILE" 2>&1
git pull origin "$BRANCH" >> "$LOG_FILE" 2>&1

if [ -f "package.json" ]; then
  echo "[$(date '+%F %T')] 检测到 Node.js 项目,安装依赖" >> "$LOG_FILE"
  npm install --production >> "$LOG_FILE" 2>&1
fi

if [ -f "requirements.txt" ]; then
  echo "[$(date '+%F %T')] 检测到 Python 项目,安装依赖" >> "$LOG_FILE"
  pip3 install -r requirements.txt >> "$LOG_FILE" 2>&1
fi

echo "[$(date '+%F %T')] 重启服务:$SERVICE_NAME" >> "$LOG_FILE"
systemctl restart "$SERVICE_NAME" >> "$LOG_FILE" 2>&1

echo "[$(date '+%F %T')] 部署完成" >> "$LOG_FILE"
echo "----------------------------------------" >> "$LOG_FILE"

赋权:

sudo chmod +x /usr/local/bin/deploy_myapp.sh

手动执行:

sudo /usr/local/bin/deploy_myapp.sh

如果你希望每天凌晨自动部署:

30 2 * * * /usr/bin/sudo /usr/local/bin/deploy_myapp.sh

不过生产环境不建议简单地每天自动部署。更好的方式是结合 GitHub Actions、GitLab CI 或 Webhook,在代码合并后触发部署。


十、使用 systemd 管理自动化任务

cron 适合定时任务,但如果你希望脚本像服务一样运行,例如后台持续监控某个目录、持续监听队列、循环检查服务状态,那么 systemd 更合适。

下面我们创建一个简单的守护脚本,每隔 30 秒检查一次 Nginx 是否运行,如果没有运行就自动重启。

创建脚本:

sudo vim /usr/local/bin/watch_nginx.sh

源码如下:

#!/bin/bash

# ==============================
# Nginx 自动守护脚本
# 功能:检测 Nginx 状态,异常时自动启动
# ==============================

LOG_FILE="/var/log/watch_nginx.log"

while true; do
  if systemctl is-active --quiet nginx; then
    echo "[$(date '+%F %T')] Nginx 正常运行" >> "$LOG_FILE"
  else
    echo "[$(date '+%F %T')] Nginx 未运行,尝试启动" >> "$LOG_FILE"
    systemctl start nginx >> "$LOG_FILE" 2>&1
  fi

  sleep 30
done

赋权:

sudo chmod +x /usr/local/bin/watch_nginx.sh

创建 systemd 服务文件:

sudo vim /etc/systemd/system/watch-nginx.service

写入:

[Unit]
Description=Watch Nginx Service
After=network.target nginx.service

[Service]
Type=simple
ExecStart=/usr/local/bin/watch_nginx.sh
Restart=always
RestartSec=5
User=root

[Install]
WantedBy=multi-user.target

重新加载 systemd:

sudo systemctl daemon-reload

启动服务:

sudo systemctl start watch-nginx.service

设置开机自启:

sudo systemctl enable watch-nginx.service

查看状态:

sudo systemctl status watch-nginx.service

查看日志:

tail -f /var/log/watch_nginx.log

需要说明的是,systemd 本身已经可以配置服务异常自动重启。例如 Nginx 服务如果使用 Restart=always 也可以实现一定程度的自愈。因此,上面的例子更适合理解 systemd 守护脚本的写法。在实际生产环境中,应优先使用服务自身的 systemd 配置来实现重启策略。


十一、用 systemd timer 替代 cron

除了 cron,Debian 还可以使用 systemd timer 执行定时任务。它的优点是日志更集中、和 systemd 服务体系集成更好,也可以支持错过任务后的补执行。

下面用 systemd timer 实现每天执行备份脚本。

创建 service:

sudo vim /etc/systemd/system/backup-web.service

内容如下:

[Unit]
Description=Backup Web Directory

[Service]
Type=oneshot
User=youruser
ExecStart=/home/youruser/automation/scripts/backup_web.sh

创建 timer:

sudo vim /etc/systemd/system/backup-web.timer

内容如下:

[Unit]
Description=Run Backup Web Daily

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
Unit=backup-web.service

[Install]
WantedBy=timers.target

启用 timer:

sudo systemctl daemon-reload
sudo systemctl enable --now backup-web.timer

查看 timer 列表:

systemctl list-timers

查看执行日志:

journalctl -u backup-web.service

相比 cron,systemd timer 的 Persistent=true 非常实用。如果机器在凌晨 2 点关机,开机后 systemd 会补执行错过的任务。


十二、批量处理文件:自动压缩图片目录

自动化不仅限于服务器运维,也可以用于文件处理。比如你有一个目录存放大量图片,希望每天自动把它们打包成一个压缩文件。

创建脚本:

vim ~/automation/scripts/archive_images.sh

源码如下:

#!/bin/bash

# ==============================
# 图片目录自动归档脚本
# ==============================

set -e

IMAGE_DIR="$HOME/Pictures"
ARCHIVE_DIR="$HOME/automation/backups/images"
LOG_FILE="$HOME/automation/logs/archive_images.log"
DATE=$(date +"%Y%m%d")
ARCHIVE_FILE="images_${DATE}.zip"

mkdir -p "$ARCHIVE_DIR"
mkdir -p "$(dirname "$LOG_FILE")"

echo "[$(date '+%F %T')] 开始归档图片目录:$IMAGE_DIR" >> "$LOG_FILE"

if [ ! -d "$IMAGE_DIR" ]; then
  echo "[$(date '+%F %T')] 图片目录不存在:$IMAGE_DIR" >> "$LOG_FILE"
  exit 1
fi

find "$IMAGE_DIR" -type f \( -name "*.jpg" -o -name "*.png" -o -name "*.jpeg" \) > /tmp/image_files.txt

if [ ! -s /tmp/image_files.txt ]; then
  echo "[$(date '+%F %T')] 没有找到图片文件" >> "$LOG_FILE"
  exit 0
fi

zip -@ "$ARCHIVE_DIR/$ARCHIVE_FILE" < /tmp/image_files.txt >> "$LOG_FILE" 2>&1

rm -f /tmp/image_files.txt

echo "[$(date '+%F %T')] 图片归档完成:$ARCHIVE_DIR/$ARCHIVE_FILE" >> "$LOG_FILE"
echo "----------------------------------------" >> "$LOG_FILE"

这个脚本的重点是:

zip -@ "$ARCHIVE_DIR/$ARCHIVE_FILE" < /tmp/image_files.txt

它可以从文件列表中读取要压缩的文件,适合批量处理。


十三、使用 rsync 实现自动同步

如果你有两台 Debian 服务器,想把本机目录同步到远程服务器,可以使用 rsync

安装:

sudo apt install -y rsync

假设你要把本机 /var/www/html 同步到远程服务器:

远程用户:deploy
远程地址:192.168.1.100
远程目录:/var/www/html

创建同步脚本:

vim ~/automation/scripts/sync_web.sh

源码如下:

#!/bin/bash

# ==============================
# rsync 自动同步脚本
# ==============================

set -e

LOCAL_DIR="/var/www/html/"
REMOTE_USER="deploy"
REMOTE_HOST="192.168.1.100"
REMOTE_DIR="/var/www/html/"
LOG_FILE="$HOME/automation/logs/sync_web.log"

mkdir -p "$(dirname "$LOG_FILE")"

echo "[$(date '+%F %T')] 开始同步" >> "$LOG_FILE"

rsync -avz --delete \
  "$LOCAL_DIR" \
  "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}" \
  >> "$LOG_FILE" 2>&1

echo "[$(date '+%F %T')] 同步完成" >> "$LOG_FILE"
echo "----------------------------------------" >> "$LOG_FILE"

赋权:

chmod +x ~/automation/scripts/sync_web.sh

为避免每次输入密码,建议配置 SSH key:

ssh-keygen -t ed25519
ssh-copy-id deploy@192.168.1.100

测试连接:

ssh deploy@192.168.1.100

然后就可以把同步任务加入 cron:

*/30 * * * * /home/youruser/automation/scripts/sync_web.sh

表示每 30 分钟同步一次。


十四、自动化脚本的安全建议

在 Debian 上编写自动化脚本时,不能只关注“能不能跑”,还要关注“是否安全、是否稳定、是否可维护”。

1. 避免直接使用危险命令

例如:

rm -rf $DIR/*

如果 $DIR 为空,可能造成严重后果。更安全的写法是:

if [ -n "$DIR" ] && [ -d "$DIR" ]; then
  rm -rf "$DIR"/*
fi

2. 给变量加双引号

推荐:

cp "$SOURCE_FILE" "$TARGET_DIR"

不推荐:

cp $SOURCE_FILE $TARGET_DIR

因为路径中如果包含空格,未加引号可能导致命令异常。

3. 使用 set -e

在脚本开头添加:

set -e

表示命令出错后立即退出,避免错误继续扩大。

也可以使用更严格的写法:

set -euo pipefail

含义是:

  • -e:命令失败立即退出;
  • -u:使用未定义变量时报错;
  • pipefail:管道中任意命令失败则整体失败。

4. 不要把密码写进脚本

不要这样写:

PASSWORD="123456"

建议使用:

  • SSH key;
  • 环境变量;
  • .env 文件并设置权限;
  • Debian secret 管理工具;
  • CI/CD 平台变量。

5. 控制脚本权限

例如:

chmod 700 ~/automation/scripts/*.sh

如果脚本包含敏感逻辑,避免普通用户读取。


十五、推荐的自动化项目结构

当你的自动化脚本越来越多时,建议整理成统一结构:

automation/
├── README.md
├── backups/
├── logs/
├── scripts/
│   ├── backup_web.sh
│   ├── clean_logs.sh
│   ├── check_disk.sh
│   ├── sync_web.sh
│   └── system_report.py
├── config/
│   └── automation.env
└── systemd/
    ├── backup-web.service
    └── backup-web.timer

你还可以创建一个统一配置文件:

vim ~/automation/config/automation.env

内容示例:

BACKUP_RETENTION_DAYS=7
DISK_THRESHOLD=80
REMOTE_HOST=192.168.1.100
REMOTE_USER=deploy

脚本中加载:

source "$HOME/automation/config/automation.env"

这样可以避免多个脚本里重复写配置,后期维护更方便。


十六、完整一键初始化脚本

最后提供一个一键初始化脚本,用于创建目录、生成常用脚本模板。

创建:

vim setup_automation.sh

完整源码如下:

#!/bin/bash

set -e

BASE_DIR="$HOME/automation"

echo "初始化 Debian 自动化工作流目录:$BASE_DIR"

mkdir -p "$BASE_DIR/scripts"
mkdir -p "$BASE_DIR/logs"
mkdir -p "$BASE_DIR/backups"
mkdir -p "$BASE_DIR/config"
mkdir -p "$BASE_DIR/systemd"

cat > "$BASE_DIR/config/automation.env" << 'EOF'
BACKUP_RETENTION_DAYS=7
DISK_THRESHOLD=80
EOF

cat > "$BASE_DIR/scripts/hello_automation.sh" << 'EOF'
#!/bin/bash

set -e

LOG_FILE="$HOME/automation/logs/hello.log"

mkdir -p "$(dirname "$LOG_FILE")"

echo "[$(date '+%F %T')] Hello Debian Automation!" >> "$LOG_FILE"
EOF

chmod +x "$BASE_DIR/scripts/hello_automation.sh"

cat > "$BASE_DIR/README.md" << 'EOF'
# Debian Automation

这是一个 Debian 工作流自动化目录。

## 目录说明

- scripts:自动化脚本
- logs:日志文件
- backups:备份文件
- config:配置文件
- systemd:systemd 服务和 timer 示例

## 测试

```bash
~/automation/scripts/hello_automation.sh
cat ~/automation/logs/hello.log

EOF

echo "初始化完成。" echo "你可以运行:" echo "$BASE_DIR/scripts/hello_automation.sh"


运行:

```bash
chmod +x setup_automation.sh
./setup_automation.sh

测试:

~/automation/scripts/hello_automation.sh
cat ~/automation/logs/hello.log

如果看到类似输出,说明初始化成功:

[2026-01-01 10:00:00] Hello Debian Automation!

十七、排查自动化任务常见问题

1. cron 中脚本能否找到命令?

cron 的环境变量比终端少,可能导致脚本中命令找不到。可以在脚本中写绝对路径,或者在 crontab 顶部添加:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

2. 脚本手动能跑,cron 不能跑?

常见原因包括:

  • 路径写成相对路径;
  • 没有执行权限;
  • cron 用户权限不足;
  • 环境变量缺失;
  • 脚本依赖交互输入;
  • 日志路径不可写。

建议把 cron 写成:

0 2 * * * /bin/bash /home/youruser/automation/scripts/backup_web.sh >> /home/youruser/automation/logs/cron.log 2>&1

3. systemd 服务启动失败怎么办?

查看状态:

sudo systemctl status 服务名

查看日志:

journalctl -u 服务名 -xe

修改 service 后需要重新加载:

sudo systemctl daemon-reload
sudo systemctl restart 服务名

4. 权限不足怎么办?

如果脚本需要访问 /var/www/var/log 或重启服务,可能需要 root 权限。可以:

  • 使用 root 的 crontab:sudo crontab -e
  • 配置 sudo 免密;
  • 使用 systemd 并指定 User=root
  • 调整目录权限和用户组。

但不要为了省事随便给目录 chmod 777,这会带来安全风险。


十八、总结

Debian 工作流自动化的核心并不复杂:把重复性操作写成脚本,再通过 cron、systemd timer 或 systemd service 定时或持续执行。Shell 脚本适合系统命令编排,Python 适合复杂逻辑和数据处理,rsync 适合同步,logrotate 适合日志轮转,systemd 则适合服务管理和更可靠的定时任务。

本文提供了多个可直接使用的源码示例,包括:

  • 网站目录自动备份;
  • 日志自动清理;
  • 磁盘空间检查;
  • Python 系统报告;
  • Git 自动部署;
  • Nginx 守护服务;
  • systemd timer 定时任务;
  • rsync 自动同步;
  • 一键初始化脚本。

如果你刚开始学习 Debian 自动化,建议从三个任务入手:自动备份、磁盘检查、日志轮转。它们简单实用,并且能帮助你快速理解 Linux 自动化的基本思想。随着需求增长,你可以把脚本拆分成模块,加入配置文件、告警系统、CI/CD 流水线,最终形成一套稳定、可维护的 Debian 自动化工作流体系。

目录结构
全文