备份定时任务脚本

备份定时任务脚本

  顾名思义,就是备份定时任务上面的脚本的脚本,挺拗口的 = =

  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

 

posted @ 2021-11-07 19:26  windysai  阅读(165)  评论(0编辑  收藏  举报