需求

线上环境有一些定时脚本(用crontab -l可查看当前用户的),有时我们可能会改这些定时任务的脚本内容。为避免改错无后悔药,需用shell实现一个程序,定时备份crontab中的.sh脚本文件

分析与思考

所有用户的crontab放在/var/spool/cron/目录,各个用户放在各自目录下。只要把这些用户的crontab读取出来,提取出其中的.sh文件,然后按照用户备份到相应目录就行。最后配一个crontab,定时去执行这个备份程序。

备份程序的实现

#!/bin/bash
# this shell script from  https://www.cnblogs.com/itwild/

# backup dir
# root user will in ${bak_dir}/root, itwild user will in ${bak_dir}/itwild
bak_dir=/var/itwild

# new file will end with 2020-02-24_00:28:56
bak_suffix=$(date '+%Y-%m-%d_%H:%M:%S')

if [[ ! $bak_dir == */ ]]; then
    bak_dir="${bak_dir}/"
fi

create_dir_if_not_exist() {
    u="$1"
    user_bak_dir="${bak_dir}$u"

    if [ ! -d "$user_bak_dir" ]; then
        mkdir -p $user_bak_dir
        chown -R ${u}:${u} $user_bak_dir
    fi
}

backup_files() {
    u="$1"
    files=$2

    for f in ${files[*]}; do
        if [[ $f == *.sh ]]; then
            # only backup file which end with .sh
            copy_file $u $f
        fi
    done
}

copy_file() {
    u="$1"
    filepath=$2

    if [ ! -f "$filepath" ];then
        return
    fi

    user_bak_dir="${bak_dir}$u"
    filename=${filepath##*/}
    cur_ms=$[$(date +%s%N)/1000000]
    # avoid same filename here add cur_ms to distinct
    newfilepath="${user_bak_dir}/${filename}.${bak_suffix}.${cur_ms}"

    # switch to user and then copy file to right position
    su - $u -c "cp $filepath $newfilepath"
}

# start from here
cd /var/spool/cron/

for u in `ls`
do
    create_dir_if_not_exist $u
    files=$(cat $u | awk '{for(i=6;i<=NF;++i) printf $i" "}')
    backup_files $u "${files[*]}"
done

说明

  • 此脚本需要用root用户去执行,因为它会把所有用户的crontab都备份到相应目录
  • 然后把这个程序配成crontab就能完成定时备份的任务
  • 此程序仅仅自用,方便以后查询shell的一些用法

使用shell程序备份crontab中的.sh脚本文件的更多相关文章

  1. shell 之 用linux定时任务crontab和watchdog.sh脚本做软件看门狗

    1.简介 看门狗的作用是定期检测服务正常运行,如果发现服务不在了,会重新拉起服务:linux中可以利用系统的定时任务功能crontab定期的去执行watchdog.sh脚本,而watchdog.sh脚 ...

  2. Linux中运行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。

    在Linux中运行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory. 分析:这是不同系统编码格式引起的:在windows系统中 ...

  3. 在Linux中执行.sh脚本,异常

    在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory. 分析:这是不同系统编码格式引起的:在windows系统中 ...

  4. 在Linux中执行.sh脚本,异常/bin/sh^M

    在Linux中执行.sh脚本,异常/bin/sh^M 在linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory. 分 ...

  5. sh脚本文件的运行

    sh脚本文件的运行mac终端下运行shell脚本 1.写好自己的 脚本,比如test-bash.sh 2.打开终端 执行,方法一: 输入命令 ./test-bash.sh , 方法二:直接把 aa.s ...

  6. linux执行sh脚本文件命令

    linux执行sh脚本文件命令 很多时候需要多个命令来完成一项工作,而这个工作又常常是重复的,这个时候我们自然会想到将这些命令写成sh脚本,下次执行下这个脚本一切就都搞定了,下面就是发布代码的一个脚本 ...

  7. crontab中部署Python脚本注意事项

    有时候手工执行Python脚本跑的好好的,但是部署到Linux的crontab中后,就会遇到一些问题,最近终于有空整理一下这方面的内容,其实也是自己也踩了一些别人踩过的坑!这里仅仅列举个人遇到的一些小 ...

  8. shell如何传递变量到另一个脚本文件中

    http://www.jbxue.com/article/shell/20707.html本文介绍了shell脚本传递变量到另一个脚本文件中的方法,在脚本中调用另一脚本,即创建了一个子进程,感兴趣的朋 ...

  9. ubuntu中写sh脚本

    批量执行命令 https://jingyan.baidu.com/article/3052f5a121c8ac97f21f8661.html 批量执行脚本也是可行的! 如,main.sh内写   sh ...

随机推荐

  1. FPGA基础知识关键点摘要

    FPGA基础知识关键点摘要 一.组合逻辑和时序逻辑的区别:组合逻辑与输入直接实时相关,时序逻辑还必须在时钟上升沿出发后输出新值,有没有时钟输入是他们最大的区别!组合时序容易出现竞争冒险现象出现亚稳态, ...

  2. python学习--quote()函数

    屏蔽特殊的字符.比如如果url里面的空格!url里面是不允许出现空格的. 在 Python2.x 中的用法是:urllib.quote(text)Python3.x 中是urllib.parse.qu ...

  3. ubuntu 如何搭建svn 服务器

    1.在终端中直接输入  sudo apt-get install subversion,选择安装即可 来这个subversion同时包含了服务端和客户端. 2.(可选)看版本命令 svnserve - ...

  4. ArrayList 并发操作 ConcurrentModificationException 异常

    1.故障现象 ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常 2.故障代码 public class ...

  5. lua学习之复习汇总篇

    第六日笔记 1. 基础概念 程序块 定义 在 lua 中任何一个源代码文件或在交互模式中输入的一行代码 程序块可以是任意大小的 程序块可以是一连串语句或一条命令 也可由函数定义构成,一般将函数定义写在 ...

  6. 编辑crontab添加Linux计划任务

    在做实验楼的比赛时的题目 用到了crontable 1. 为用户shiyanlou添加一个计划任务 2. 每天凌晨2点定时执行 3. 将/var/log/dpkg.log /var/log/mysql ...

  7. 小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  8. Solr搜索解析及查询解析器用法概述

    一.简介 大多数查询都使用 了标准的Solr语法.这种语法是Solr最常见的,由默认查询解析器负责处理.Solr的默认查询解析器是Lucene查询解析器[LuceneQParserPlugin类实现] ...

  9. php 截取字符串长度 并 把超出规定长度的内容用...替代

    <?php header("content-type:text/html;charset=utf-8");#设置文件编码 error_reporting(E_ALL);#设置 ...

  10. 06_TypeScript泛型

    1.泛型的定义 泛型就是解决 类,接口 方法的复用性,以及对不特定数据的支持(类型校验). 2.泛型函数 //T 表示泛型,具体什么类型是调用这个方法的时候决定的, //T可以用其他大写字母表示,传入 ...