备份定时任务脚本
顾名思义,就是备份定时任务上面的脚本的脚本,挺拗口的 = =
linux放在crond定时任务的脚本一般如下形式:
分 时 日 月 周 bash/sh 脚本名
一个正规、好看的格式,在字段之间应该只有一个空格,所以本文并不探讨那种多空格的情况。以下这种不考虑!!!(当然优化的话,可以做~~不过何必呢,看着都难受,还不如手动调好格式)
写这个脚本的时候有几个注意点:
1、定时任务,不一定最后的字段是脚本,可能是些命令,诸如复制,目录路径之类的。为了防止这种情况,需要读取 /var/spool/cron/用户名 列表,脚本上用cronlist写入这个列表。
2、执行脚本的用户要有读取 /var/spool/cron/ 的权限,要不就普通用户 sudo 提权的,要不就直接挂root执行
3、拿到crontab计划任务列表最后一个字段之后,要判断两个情况:
(1)这个脚本是否存在(线上还真的挂了个已删了脚本文件的定时任务)
(2)防止拿到最后第7个字段是目录的情况,导致脚本报错,需要判断有没有脚本后缀。我工作环境一般就是 .sh 或者 .py,所以有这两个关键字就摘取下来了
其他情况,不知道有没有考虑清楚了,如果有什么不对,欢迎读者指出 ^___^
贴上脚本:
1 #!/bin/bash 2 3 ### 1、备份路径 4 target_dir='/root/crontab_backup' 5 [ ! -d ${target_dir} ] && mkdir -p ${target_dir} 6 7 baktime=`date +%Y%m%d` 8 Hostname=`echo $HOSTNAME` 9 tmpfile=${target_dir}/tmpfile 10 source='/var/spool/cron' 11 12 13 ### 传到远程备份(这块还没写完....,待续) 14 #echo 'user xxx xxx' >ftptemp.txt 15 #echo ' ' >ftptemp2.txt 16 #echo 'bin' >>ftptemp.txt 17 18 19 ## 备份目录:以主机名作为目录名 20 #echo "mkdir $Hostname-${baktime}" >> ftptemp.txt 21 22 ### 统计多少个用户有计划任务(这个也没什么用的) 23 cron_usernum='ls /var/spool/cron |wc -l' 24 25 for user in `ls /var/spool/cron`; 26 do 27 ## 如果不存在当前用户的备份目录,则创建 28 bakuser=${target_dir}/${user} 29 [ ! -d ${bakuser} ] && mkdir -p ${bakuser} 30 31 ## (1)获取当前用户的计划任务列表,防止仅是命令的情况 32 bakuser_cronlist=${bakuser}/cronlist 33 cat ${source}/$user > ${bakuser_cronlist} 34 35 ## (2)获取当前用户的计划任务脚本 36 cat ${source}/$user | grep -v ^$ | grep -v "^#" | awk '{print $7}' | tr -s '\n' | awk '{print $NF}' | uniq 37 | sort > ${tmpfile} 38 39 ## 找到最后一列: 脚本路径+文件名 40 ## 遍历,找到文件逐个复制到备份目录 41 42 cat ${tmpfile} | while read line 43 do 44 f1=`echo $line` 45 ## 判断最后一列,是脚本则备份 46 keyword1=".sh" 47 keyword2=".py" 48 49 result1=$(echo $f1 | grep "${keyword1}") 50 result2=$(echo $f1 | grep "${keyword2}") 51 52 if [ "$result1" != "" -o "$result2" != "" ]; 53 then 54 cp $f1 ${bakuser}/ 55 fi 56 done 57 done