MST
星途 面试题库

面试题:Bash脚本自动化:高可用的cron任务设计

设计一个高可用的Bash脚本定时任务系统,使用cron作为调度工具。该系统需满足以下条件:1. 主从架构,当主服务器上的任务执行失败时,从服务器能够自动接管任务并执行。2. 具备任务执行状态监控和报警机制,通过邮件通知管理员任务执行异常。3. 支持动态添加、修改和删除定时任务。请阐述整体设计思路,并给出关键代码片段示例。
46.2万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

整体设计思路

  1. 主从架构实现
    • 在主服务器和从服务器上都设置相同的cron任务配置,但通过某种方式标识主从。例如,可以在主服务器上创建一个特定文件(如/var/run/master.lock),主服务器每次执行任务前检查该文件是否存在,存在则执行任务,不存在则不执行。从服务器同理,当主服务器故障,该文件被删除后,从服务器发现文件不存在则开始执行任务。
    • 使用分布式锁服务(如Redis)也是一种可行方案,主服务器获取锁后执行任务,从服务器在主服务器获取锁失败(即主服务器故障)时尝试获取锁并执行任务。
  2. 任务执行状态监控和报警机制
    • 在任务脚本中记录任务执行状态,例如在任务开始和结束时分别记录时间戳,在任务结束时判断执行过程是否出错(通过返回值或特定的错误日志)。
    • 编写一个监控脚本,定期检查任务执行记录,发现异常则通过邮件发送通知给管理员。可以使用mail命令或者调用Python等语言的邮件发送库来实现邮件发送功能。
  3. 动态添加、修改和删除定时任务
    • 设计一个管理接口,如通过Web API或者命令行工具。对于Web API,可以使用Python的Flask、Django等框架,命令行工具可以使用Bash脚本结合crontab命令来实现。
    • 动态修改crontab文件,添加新任务时,生成新的任务行并追加到crontab文件;修改任务时,先删除原任务行再添加新任务行;删除任务时,从crontab文件中删除对应的任务行。

关键代码片段示例

  1. 主从任务执行判断(以文件标识为例)
#!/bin/bash
# 主服务器任务执行脚本示例
if [ -f /var/run/master.lock ]; then
    # 实际任务执行代码,例如:
    /path/to/your/script.sh
else
    echo "Not the master, skipping task."
fi
  1. 任务执行状态监控和报警脚本
#!/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
  1. 动态添加任务(以命令行工具为例)
#!/bin/bash
# 添加新任务
new_task="*/5 * * * * /path/to/new/script.sh"
echo "$new_task" | crontab -
  1. 动态修改任务
#!/bin/bash
# 删除原任务
crontab -l | grep -v "/path/to/old/script.sh" | crontab -
# 添加新任务
new_task="*/10 * * * * /path/to/new/script.sh"
echo "$new_task" | crontab -
  1. 动态删除任务
#!/bin/bash
# 删除指定任务
crontab -l | grep -v "/path/to/delete/script.sh" | crontab -