定时任务管理脚本#
脚本说明#
定时任务管理脚本用于管理系统定时任务(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 "$@"使用说明#
添加执行权限:
chmod +x crontab_manager.sh基本用法:
# 列出定时任务 ./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高级用法:
# 指定用户 ./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: 用于定时任务管理
注意事项#
- 需要root权限管理其他用户的定时任务
- 删除操作会自动备份
- 导入前建议先备份
- cron表达式格式必须正确
- 定时任务执行权限需要正确配置