Linux自动化:Cron与Systemd的Bash脚本使用指南

引言

在Linux上自动化Bash脚本对于系统管理任务至关重要,比如安装应用程序和监控系统日志。Cron是一个作业调度器,用于在特定时间间隔运行任务,而systemd则充当服务管理器,通过Linux中的服务配置文件处理应用程序。

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

先决条件

在开始之前:

  • 部署一个Ubuntu服务器

  • 将子域名指向服务器

  • 使用具有sudo权限的标准用户SSH登录

  • 安装LAMP堆栈。

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

    雨云注册链接:https://www.rainyun.com/NTE2NDM3_?s=blog

    以下步骤仅供参考,请根据实际需求选择配置。注册5折优惠码:NTE2NDM3

    购买云服务器
    本示例中,我们选择了香港作为服务器区域。

    点击 云产品云服务器立即购买

https://syxoss.oss-cn-hangzhou.aliyuncs.com/Typora202411211020032.png

选择操作系统
在创建服务器实例时,选择 Ubuntu 作为操作系统。

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

https://syxoss.oss-cn-hangzhou.aliyuncs.com/Typora202411210947807.png

创建Bash脚本

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

  1. 切换到你的用户主目录。

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

  3. 将以下内容添加到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文件,用于存储从系统日志文件/var/log/syslog中筛选的结果,使用while循环。脚本筛选结果并每次在/var/log/syslog文件中显示新错误时,将其写入相应的错误或警告文件。

  1. 创建另一个backup.sh脚本。

  2. 将以下内容添加到文件中。

#!/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应用程序的备份。

  1. 将Bash脚本移动到系统级目录,如/opt
$ sudo cp backup.sh log-monitor.sh /opt/
  1. 在你选择的系统级目录下创建一个新的data目录。
$ sudo mkdir -p /opt/data
  1. 将目录权限更改为777,以允许所有用户写入文件。
$ sudo chmod 777 /opt/data

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

Cron创建作业,你可以使用这些作业来安排并自动在特定时间间隔运行Bash脚本。按照以下步骤自动化你之前创建的Bash脚本,以自动备份MySQL数据库和Web应用程序文件。

  1. 打开Crontab编辑器。

    当提示时选择你希望的文本编辑器来编辑Crontab文件。例如,选择1选择nano文本编辑器。

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

0 2 * * * /opt/backup.sh

保存并关闭文件。

上述cron作业每天凌晨2:00运行backup.sh脚本,以备份数据库和Web应用程序文件。在上面的cron作业中:

  • 0:在分钟开始时运行脚本。设置一个059之间的值。
  • 2:在凌晨2:00运行Bash脚本。指定一个023之间的小时。
  • *:每天每月的这一天运行Bash脚本。指定一个131之间的天。
  • *:每月的这个月运行Bash脚本。指定一个112之间的月。
  • *:每天运行Bash脚本。指定一个07之间的星期几。
  1. 列出所有Cron作业并验证新的Bash脚本任务是否可用。

输出:

#
# 更多信息请查看crontab(5)和cron(8)的手册页
#
# m h dom mon dow   command

0 2 * * * ~/backup.sh

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

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

  1. 创建一个新的系统服务文件,例如logmonitor.service
$ sudo nano /etc/systemd/system/logmonitor.service
  1. 将以下内容添加到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文件中的日志条目。

  1. 重新加载systemd以应用服务文件更改。
$ sudo systemctl daemon-reload
  1. 启用新系统服务以在启动时自动启动。
$ sudo systemctl enable logmonitor.service

输出:

创建了符号链接 /etc/systemd/system/multi-user.target.wants/logmonitor.service → /etc/systemd/system/logmonitor.service。
  1. 启动系统服务。
$ sudo systemctl start logmonitor
  1. 查看系统服务状态并验证它正在运行。
$ 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

Nov 06 13:20:07 Linux-server systemd[1]: Started logmonitor.service - Automatic System Logs Monitoring and Filtering.
  1. 运行以下命令以模拟/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"
  1. 列出/opt/data目录中的所有文件,并验证error_log.txtwarning_log.txt文件是否可用。

输出:

error_log.txt warning_log.txt
  1. 查看error_log.txt文件,并验证文件中只有错误条目。

输出:

2024-11-06T13:33:48.010096+00:00 Server linuxuser: This is a simulated error log message from MySQL
2024-11-06T13:33:48.010096+00:00 Server linuxuser: This is a simulated error log message from PHP

结论

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

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐