Linux自动化:Cron与Systemd的Bash脚本使用指南
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
购买云服务器
本示例中,我们选择了香港作为服务器区域。点击 云产品 → 云服务器 → 立即购买

选择操作系统
在创建服务器实例时,选择 Ubuntu 作为操作系统。
连接到服务器
使用 X-shell 或偏好的 SSH 客户端,通过远程用户名和密码连接到服务器。成功连接后,将看到特定的欢迎信息,表明已成功登录。

创建Bash脚本
Bash脚本支持多个命令和函数,这些命令和函数定义了任务在系统中的运行方式。按照以下步骤创建新的Bash脚本来备份关键的Web应用程序文件,并监控系统日志中的错误。
-
切换到你的用户主目录。
-
创建一个新的
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.txt和warning_log.txt文件,用于存储从系统日志文件/var/log/syslog中筛选的结果,使用while循环。脚本筛选结果并每次在/var/log/syslog文件中显示新错误时,将其写入相应的错误或警告文件。
-
创建另一个
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_backup和web_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文本编辑器。 -
在文件末尾添加以下指令。
0 2 * * * /opt/backup.sh
保存并关闭文件。
上述cron作业每天凌晨2:00运行backup.sh脚本,以备份数据库和Web应用程序文件。在上面的cron作业中:
0:在分钟开始时运行脚本。设置一个0到59之间的值。2:在凌晨2:00运行Bash脚本。指定一个0到23之间的小时。*:每天每月的这一天运行Bash脚本。指定一个1到31之间的天。*:每月的这个月运行Bash脚本。指定一个1到12之间的月。*:每天运行Bash脚本。指定一个0到7之间的星期几。
- 列出所有Cron作业并验证新的Bash脚本任务是否可用。
输出:
#
# 更多信息请查看crontab(5)和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
输出:
创建了符号链接 /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
Nov 06 13:20:07 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.txt和warning_log.txt文件是否可用。
输出:
error_log.txt warning_log.txt
- 查看
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作业,指定每个所需的命令。
更多推荐


所有评论(0)