Debian 自动化实战:从备份、巡检到部署的一套脚本方案
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
这个脚本做了几件事:
- 检查备份源目录是否存在;
- 使用
tar -czf打包压缩; - 将运行状态写入日志文件;
- 删除超过 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
我们希望脚本完成以下操作:
- 进入项目目录;
- 拉取最新代码;
- 安装依赖;
- 重启服务;
- 记录部署日志。
创建脚本:
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 自动化工作流体系。