如何在 Linux 上使用 Cron 和 Systemd 自动化 Bash 脚本,以每天自动备份 MySQL 数据库和 Web 应用程序文件

在 Linux 系统管理中,自动化 Bash 脚本对于执行安装应用程序和监控系统日志等任务至关重要。Cron 是一个定时任务调度器,用于在特定时间间隔运行任务;而 Systemd 作为服务管理器,负责在 Linux 中通过服务配置文件管理应用程序。

本文将介绍如何在 Linux 上使用 Cron 和 Systemd 自动化 Bash 脚本,以自动执行和管理系统任务。

先决条件

在开始之前,需要准备一台安装了 Ubuntu 操作系统的服务器

选择服务器提供商
为了本教程的演示,我将以一个具体的云服务提供商为例,展示如何进行操作。选择哪个提供商根据您的个人偏好和需求来决定。

以下步骤仅供参考,请根据实际需求选择配置。

购买云服务器
本示例中,我们选择了香港作为服务器区域。
点击 云产品云服务器立即购买
选择操作系统
在创建服务器实例时,选择 Ubuntu 24.04 作为操作系统。

连接到服务器
使用 X-shell 或您偏好的 SSH 客户端,通过远程用户名和密码连接到您的服务器。成功连接后,您将看到特定的欢迎信息,表明您已成功登录。

  • 使用 SSH 以非 root 用户身份访问实例,并具有 sudo 权限。
  • 安装 LAMP 堆栈。

创建 Bash 脚本

Bash 脚本支持多个命令和函数,定义了系统任务的运行方式。按照以下步骤创建新的 Bash 脚本来备份关键的 Web 应用程序文件,并监控系统日志中的错误。

切换到用户主目录。

cd

创建一个新的 log-monitor.sh 脚本。

nano log-monitor.sh

log-monitor.sh 文件中添加以下内容:

#!/bin/bash

LOG_FILE="/var/log/syslog"
ERROR_LOG="/opt/data/error_log.txt"
WARNING_LOG="/opt/data/warning_log.txt"

tail -F "$LOG_FILE" | while read line; do
    if echo "$line" | grep -q "error"; then
        echo "$line" >> "$ERROR_LOG"
    elif echo "$line" | grep -q "warning"; then
        echo "$line" >> "$WARNING_LOG"
    fi
done

保存并关闭文件。

上述 Bash 脚本在 /opt/data 目录中创建 error_log.txtwarning_log.txt 文件,使用 while 循环从 /var/log/syslog 系统日志文件中筛选结果。脚本筛选结果,并在 /var/log/syslog 文件中每次显示新错误时写入相应的错误或警告文件。

创建另一个 backup.sh 脚本。

nano backup.sh

在文件中添加以下内容:

!/bin/bash

DB_USER="user"
DB_PASSWORD="new-password"
DB_NAME="mysql"

DB_BACKUP_DIR="mysql_backup"
WEB_FILES_DIR="web_backup"

mkdir -p "$DB_BACKUP_DIR"
mkdir -p "$WEB_FILES_DIR"

DATE=$(date +"%Y%m%d_%H%M%S")

mysqldump -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$DB_BACKUP_DIR/db_backup_$DATE.sql"
echo "MySQL backup completed: $DB_BACKUP_DIR/db_backup_$DATE.sql"

tar -czf "$WEB_FILES_DIR/web_backup_$DATE.tar.gz" /var/www/html
echo "Web application backup completed: $WEB_FILES_DIR/web_backup_$DATE.tar.gz"

保存并关闭文件。

上述 Bash 脚本使用 DB_... 变量连接 MySQL 数据库服务器。然后创建 mysql_backupweb_backup 目录以存储数据库和 Web 应用程序的备份。

将 Bash 脚本移动到系统级目录,如 /opt

$ sudo cp backup.sh log-monitor.sh /opt/

在所选的系统级目录下创建一个新的 data 目录。

$ sudo mkdir -p /opt/data

将目录权限更改为 777,以允许所有用户写入文件。

$ sudo chmod 777 /opt/data

使用 Cron 自动化 Linux 上的 Bash 脚本

Cron 创建作业,您可以使用它来安排和自动运行 Bash 脚本。按照以下步骤自动化之前创建的 Bash 脚本,以每天自动备份 MySQL 数据库和 Web 应用程序文件。

打开 Crontab 编辑器。

当提示时选择您想要的文本编辑器编辑 Crontab 文件。例如,选择 1 选择 nano 文本编辑器。

crontab -e

在文件末尾添加以下指令。

0 2 * * * /opt/backup.sh

保存并关闭文件。

列出所有 Cron 作业并验证新的 Bash 脚本任务是否可用。

crontab -e

输出:

# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

0 2 * * * ~/backup.sh

使用 Systemd 将 Bash 脚本作为系统服务自动化

Systemd 在启动时自动启动系统服务,并提供停止和重启服务的选项。按照以下步骤将之前创建的监控 Bash 脚本设置为新的系统服务,并使用 Systemd 管理服务。

创建一个新的系统服务文件,例如 logmonitor.service

$ sudo nano /etc/systemd/system/logmonitor.service

logmonitor.service 文件中添加以下内容。

[Unit]
Description= Automatic System Logs Monitoring and Filtering
After=network.target

[Service]
ExecStart=bash /opt/log-monitor.sh
Restart=always

[Install]
WantedBy=multi-user.target

保存并关闭文件。

上述服务配置在 /opt 目录中运行 log-monitor.sh Bash 脚本,监控和过滤 /var/log/syslog 文件中的日志条目。

重新加载 Systemd 以应用服务文件更改。

$ sudo systemctl daemon-reload

启用新系统服务以在启动时自动启动。

$ sudo systemctl enable logmonitor.service

输出:

Created symlink /etc/systemd/system/multi-user.target.wants/logmonitor.service → /etc/systemd/system/logmonitor.service.

启动系统服务。

$ sudo systemctl start logmonitor

查看系统服务状态并验证其是否运行。

$ sudo systemctl status logmonitor

输出:

● logmonitor.service - Automatic System Logs Monitoring and Filtering
 Loaded: loaded (/etc/systemd/system/logmonitor.service; enabled; preset: enabled)
 Active: active (running) since Wed 2024-11-06 13:20:07 UTC; 11s ago
Main PID: 14293 (bash)
  Tasks: 3 (limit: 1062)
 Memory: 784.0K (peak: 1.5M)
    CPU: 40ms
 CGroup: /system.slice/logmonitor.service
         ├─14293 bash /opt/log-monitor.sh
         ├─14308 tail -F /var/log/syslog
         └─14309 bash /opt/log-monitor.sh
 Linux-server systemd[1]: Started logmonitor.service - Automatic System Logs Monitoring and Filtering.

运行以下命令模拟 /var/log/syslog 文件中的新错误和警告条目。

logger -p user.err "This is a simulated error log message from MySQL"
logger -p user.err "This is a simulated warning log message from Apache"
logger -p user.err "This is a simulated error log message from PHP"
logger -p user.err "This is a simulated Warning log message from MySQL"

列出 /opt/data 目录中的所有文件,并验证 error_log.txtwarning_log.txt 文件是否可用。

ls /opt/da

输出:

error_log.txt warning_log.txt

查看 error_log.txt 文件,并验证文件中仅包含错误条目。

ls /opt/data

结论

您已经使用 Cron 和 Systemd 在 Linux 服务器上自动化了 Bash 脚本。自动化 Bash 脚本允许您运行常见的系统管理任务,如备份和错误监控。要简化系统管理,请创建多个 Bash 脚本和 Cron 作业,并为每个脚本和 Cron 作业指定必要的命令。