定时任务管理脚本#

脚本说明#

定时任务管理脚本用于管理系统定时任务(crontab),包括添加、删除、列表、备份等操作。

脚本代码#

#!/bin/bash

# 定时任务管理脚本
# 功能:管理系统定时任务(crontab)
# 作者:System Admin
# 日期:2026-01-01

set -euo pipefail

# 配置变量
BACKUP_DIR="/backup/crontab"
LOG_FILE="/var/log/crontab_manager.log"
USER=""
CRON_FILE=""

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 日志函数
log() {
    local level=$1
    shift
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] [$level] $@" | tee -a "$LOG_FILE"
}

log_info() {
    log "INFO" "$@"
}

log_error() {
    log "ERROR" "$@"
}

# 检查crontab
check_crontab() {
    if ! command -v crontab &> /dev/null; then
        log_error "crontab未安装"
        return 1
    fi
    return 0
}

# 创建备份目录
create_backup_dir() {
    if [ ! -d "$BACKUP_DIR" ]; then
        mkdir -p "$BACKUP_DIR"
        log_info "创建备份目录: $BACKUP_DIR"
    fi
}

# 备份定时任务
backup_crontab() {
    local user=${1:-$USER}
    
    log_info "备份定时任务: $user"
    
    create_backup_dir
    
    local timestamp=$(date +%Y%m%d_%H%M%S)
    local backup_file="$BACKUP_DIR/crontab_${user}_${timestamp}.bak"
    
    if [ -n "$user" ]; then
        crontab -l -u "$user" > "$backup_file" 2>/dev/null || true
    else
        crontab -l > "$backup_file" 2>/dev/null || true
    fi
    
    log_info "备份完成: $backup_file"
}

# 列出定时任务
list_crontab() {
    local user=${1:-$USER}
    
    log_info "列出定时任务: $user"
    
    if [ -n "$user" ]; then
        crontab -l -u "$user" 2>/dev/null || log_info "没有定时任务"
    else
        crontab -l 2>/dev/null || log_info "没有定时任务"
    fi
}

# 显示定时任务详情
show_crontab_details() {
    local user=${1:-$USER}
    
    log_info "定时任务详情: $user"
    
    local crontab_content
    if [ -n "$user" ]; then
        crontab_content=$(crontab -l -u "$user" 2>/dev/null || echo "")
    else
        crontab_content=$(crontab -l 2>/dev/null || echo "")
    fi
    
    if [ -z "$crontab_content" ]; then
        log_info "没有定时任务"
        return 0
    fi
    
    echo "定时任务列表"
    echo "=========="
    echo "用户: ${user:-$(whoami)}"
    echo ""
    
    local line_num=0
    echo "$crontab_content" | while IFS= read -r line; do
        if [[ ! "$line" =~ ^# ]] && [[ ! "$line" =~ ^$ ]]; then
            line_num=$((line_num + 1))
            echo "[$line_num] $line"
        fi
    done
    
    echo ""
    echo "总计: $line_num 个任务"
}

# 添加定时任务
add_crontab() {
    local user=${1:-$USER}
    local cron_expression=$2
    local command=$3
    
    log_info "添加定时任务: $user"
    
    # 备份当前定时任务
    backup_crontab "$user"
    
    # 添加新任务
    if [ -n "$user" ]; then
        (crontab -l -u "$user" 2>/dev/null; echo "$cron_expression $command") | crontab -u "$user" -
    else
        (crontab -l 2>/dev/null; echo "$cron_expression $command") | crontab -
    fi
    
    log_info "定时任务添加成功"
}

# 删除定时任务
delete_crontab() {
    local user=${1:-$USER}
    local task_number=$2
    
    log_info "删除定时任务: $user, 任务号: $task_number"
    
    # 备份当前定时任务
    backup_crontab "$user"
    
    # 获取当前定时任务
    local crontab_content
    if [ -n "$user" ]; then
        crontab_content=$(crontab -l -u "$user" 2>/dev/null || echo "")
    else
        crontab_content=$(crontab -l 2>/dev/null || echo "")
    fi
    
    if [ -z "$crontab_content" ]; then
        log_error "没有定时任务"
        return 1
    fi
    
    # 删除指定任务
    local new_content=""
    local current_line=0
    
    echo "$crontab_content" | while IFS= read -r line; do
        if [[ ! "$line" =~ ^# ]] && [[ ! "$line" =~ ^$ ]]; then
            current_line=$((current_line + 1))
            if [ $current_line -ne $task_number ]; then
                echo "$line"
            fi
        else
            echo "$line"
        fi
    done > /tmp/new_crontab
    
    # 更新定时任务
    if [ -n "$user" ]; then
        crontab -u "$user" /tmp/new_crontab
    else
        crontab /tmp/new_crontab
    fi
    
    rm -f /tmp/new_crontab
    
    log_info "定时任务删除成功"
}

# 从文件导入定时任务
import_crontab() {
    local user=${1:-$USER}
    local file=$2
    
    log_info "导入定时任务: $user, 文件: $file"
    
    if [ ! -f "$file" ]; then
        log_error "文件不存在: $file"
        return 1
    fi
    
    # 备份当前定时任务
    backup_crontab "$user"
    
    # 导入定时任务
    if [ -n "$user" ]; then
        crontab -u "$user" "$file"
    else
        crontab "$file"
    fi
    
    log_info "定时任务导入成功"
}

# 导出定时任务到文件
export_crontab() {
    local user=${1:-$USER}
    local file=$2
    
    log_info "导出定时任务: $user, 文件: $file"
    
    if [ -n "$user" ]; then
        crontab -l -u "$user" > "$file" 2>/dev/null || true
    else
        crontab -l > "$file" 2>/dev/null || true
    fi
    
    log_info "定时任务导出成功: $file"
}

# 清空定时任务
clear_crontab() {
    local user=${1:-$USER}
    
    log_info "清空定时任务: $user"
    
    # 备份当前定时任务
    backup_crontab "$user"
    
    # 清空定时任务
    if [ -n "$user" ]; then
        crontab -r -u "$user" 2>/dev/null || true
    else
        crontab -r 2>/dev/null || true
    fi
    
    log_info "定时任务清空成功"
}

# 验证cron表达式
validate_cron_expression() {
    local expression=$1
    
    log_info "验证cron表达式: $expression"
    
    # 检查格式
    if [[ ! "$expression" =~ ^[0-9\*,-/]+\ +[0-9\*,-/]+\ +[0-9\*,-/]+\ +[0-9\*,-/]+\ +[0-9\*,-/]+$ ]]; then
        log_error "无效的cron表达式"
        return 1
    fi
    
    log_info "cron表达式有效"
    return 0
}

# 生成cron表达式
generate_cron_expression() {
    local type=$1
    local value=$2
    
    log_info "生成cron表达式: $type=$value"
    
    case $type in
        minute)
            echo "*/$value * * * *"
            ;;
        hour)
            echo "0 */$value * * *"
            ;;
        day)
            echo "0 0 */$value * *"
            ;;
        week)
            echo "0 0 * * $value"
            ;;
        month)
            echo "0 0 $value * *"
            ;;
        *)
            log_error "无效的类型: $type"
            return 1
            ;;
    esac
}

# 显示帮助
show_help() {
    echo "用法: $0 [选项] <操作> [参数]"
    echo ""
    echo "选项:"
    echo "  -u <用户>        指定用户(默认: 当前用户)"
    echo "  -h               显示帮助信息"
    echo ""
    echo "操作:"
    echo "  list                      列出定时任务"
    echo "  show                      显示定时任务详情"
    echo "  add <表达式> <命令>       添加定时任务"
    echo "  delete <任务号>           删除定时任务"
    echo "  import <文件>            从文件导入定时任务"
    echo "  export <文件>            导出定时任务到文件"
    echo "  clear                     清空定时任务"
    echo "  backup                    备份定时任务"
    echo "  validate <表达式>         验证cron表达式"
    echo "  generate <类型> <值>      生成cron表达式"
    echo ""
    echo "示例:"
    echo "  $0 list"
    echo "  $0 show"
    echo "  $0 add \"0 2 * * *\" \"/path/to/script.sh\""
    echo "  $0 delete 1"
    echo "  $0 import cron.txt"
    echo "  $0 export cron.txt"
    echo "  $0 clear"
    echo "  $0 validate \"0 2 * * *\""
    echo "  $0 generate hour 6"
}

# 主函数
main() {
    # 解析选项
    while getopts "u:h" opt; do
        case $opt in
            u)
                USER="$OPTARG"
                log_info "用户: $USER"
                ;;
            h)
                show_help
                exit 0
                ;;
            *)
                log_error "无效选项: $opt"
                show_help
                exit 1
                ;;
        esac
    done
    
    shift $((OPTIND - 1))
    
    # 检查crontab
    if ! check_crontab; then
        exit 1
    fi
    
    # 检查操作
    if [ $# -eq 0 ]; then
        log_error "缺少操作"
        show_help
        exit 1
    fi
    
    OPERATION=$1
    shift
    
    # 执行操作
    case $OPERATION in
        list)
            list_crontab "$USER"
            ;;
        show)
            show_crontab_details "$USER"
            ;;
        add)
            if [ $# -lt 2 ]; then
                log_error "缺少参数"
                show_help
                exit 1
            fi
            add_crontab "$USER" "$1" "$2"
            ;;
        delete)
            if [ $# -eq 0 ]; then
                log_error "缺少任务号"
                show_help
                exit 1
            fi
            delete_crontab "$USER" "$1"
            ;;
        import)
            if [ $# -eq 0 ]; then
                log_error "缺少文件"
                show_help
                exit 1
            fi
            import_crontab "$USER" "$1"
            ;;
        export)
            if [ $# -eq 0 ]; then
                log_error "缺少文件"
                show_help
                exit 1
            fi
            export_crontab "$USER" "$1"
            ;;
        clear)
            clear_crontab "$USER"
            ;;
        backup)
            backup_crontab "$USER"
            ;;
        validate)
            if [ $# -eq 0 ]; then
                log_error "缺少表达式"
                show_help
                exit 1
            fi
            validate_cron_expression "$1"
            ;;
        generate)
            if [ $# -lt 2 ]; then
                log_error "缺少参数"
                show_help
                exit 1
            fi
            generate_cron_expression "$1" "$2"
            ;;
        *)
            log_error "无效的操作: $OPERATION"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"

使用说明#

  1. 添加执行权限:

    chmod +x crontab_manager.sh
  2. 基本用法:

    # 列出定时任务
    ./crontab_manager.sh list
    
    # 显示定时任务详情
    ./crontab_manager.sh show
    
    # 添加定时任务
    ./crontab_manager.sh add "0 2 * * *" "/path/to/script.sh"
    
    # 删除定时任务
    ./crontab_manager.sh delete 1
    
    # 导出定时任务
    ./crontab_manager.sh export cron.txt
    
    # 导入定时任务
    ./crontab_manager.sh import cron.txt
    
    # 清空定时任务
    ./crontab_manager.sh clear
  3. 高级用法:

    # 指定用户
    ./crontab_manager.sh -u root list
    
    # 验证cron表达式
    ./crontab_manager.sh validate "0 2 * * *"
    
    # 生成cron表达式
    ./crontab_manager.sh generate hour 6
    ./crontab_manager.sh generate day 7

功能特点#

  • 定时任务列表显示
  • 添加/删除定时任务
  • 导入/导出定时任务
  • 定时任务备份
  • cron表达式验证
  • cron表达式生成
  • 多用户支持

依赖项#

  • crontab: 用于定时任务管理

注意事项#

  1. 需要root权限管理其他用户的定时任务
  2. 删除操作会自动备份
  3. 导入前建议先备份
  4. cron表达式格式必须正确
  5. 定时任务执行权限需要正确配置