整体设计思路
- 主从架构实现:
- 在主服务器和从服务器上都设置相同的cron任务配置,但通过某种方式标识主从。例如,可以在主服务器上创建一个特定文件(如
/var/run/master.lock
),主服务器每次执行任务前检查该文件是否存在,存在则执行任务,不存在则不执行。从服务器同理,当主服务器故障,该文件被删除后,从服务器发现文件不存在则开始执行任务。
- 使用分布式锁服务(如Redis)也是一种可行方案,主服务器获取锁后执行任务,从服务器在主服务器获取锁失败(即主服务器故障)时尝试获取锁并执行任务。
- 任务执行状态监控和报警机制:
- 在任务脚本中记录任务执行状态,例如在任务开始和结束时分别记录时间戳,在任务结束时判断执行过程是否出错(通过返回值或特定的错误日志)。
- 编写一个监控脚本,定期检查任务执行记录,发现异常则通过邮件发送通知给管理员。可以使用
mail
命令或者调用Python等语言的邮件发送库来实现邮件发送功能。
- 动态添加、修改和删除定时任务:
- 设计一个管理接口,如通过Web API或者命令行工具。对于Web API,可以使用Python的Flask、Django等框架,命令行工具可以使用Bash脚本结合
crontab
命令来实现。
- 动态修改
crontab
文件,添加新任务时,生成新的任务行并追加到crontab
文件;修改任务时,先删除原任务行再添加新任务行;删除任务时,从crontab
文件中删除对应的任务行。
关键代码片段示例
- 主从任务执行判断(以文件标识为例):
#!/bin/bash
# 主服务器任务执行脚本示例
if [ -f /var/run/master.lock ]; then
# 实际任务执行代码,例如:
/path/to/your/script.sh
else
echo "Not the master, skipping task."
fi
- 任务执行状态监控和报警脚本:
#!/bin/bash
# 假设任务执行日志文件为 /var/log/task.log
last_status=$(tail -n 1 /var/log/task.log | grep -o "success\|failure")
if [ "$last_status" == "failure" ]; then
subject="Task Execution Failed"
body="The task has failed. Please check the log: /var/log/task.log"
echo "$body" | mail -s "$subject" admin@example.com
fi
- 动态添加任务(以命令行工具为例):
#!/bin/bash
# 添加新任务
new_task="*/5 * * * * /path/to/new/script.sh"
echo "$new_task" | crontab -
- 动态修改任务:
#!/bin/bash
# 删除原任务
crontab -l | grep -v "/path/to/old/script.sh" | crontab -
# 添加新任务
new_task="*/10 * * * * /path/to/new/script.sh"
echo "$new_task" | crontab -
- 动态删除任务:
#!/bin/bash
# 删除指定任务
crontab -l | grep -v "/path/to/delete/script.sh" | crontab -