linux定时任务备份及恢复
crontab误删除恢复
一、背景说明:
部署于Linux服务器的定时任务->crontab命令后添加参数有以下功能:
1. crontab -l :查看所有定时任务;
2. crontab -e :编辑定时任务;
3. crontab -r :清空所有定时任务。
以上功能中,输入crontab -r 命令后会删除全部定时任务。
因此,运维人员如需删除、修改“个别任务”时严禁使用crontab –r命令,因为这会造成清空全部命令。
正确的做法是使用crontab –e命令去编辑定时任务(具体做法,见“四、恢复方案4.1”)。
二、异常情况:
远程工具putty、xshell中,使用crontab时,以下情况均会造成均服务器定时任务被清空:
1、出现网络波动;
2、该session被kill;
3、工具后台进程被kill;
4、输入crontab直接回车。
三、备份方案:
3.1、手动备份(以20220526日为例) (有shell脚本定时生成,可忽略)
1. Xshell登录linux系统服务器,user1用户
2. 查看当前目录:pwd
#注:当前目录为/home/user1
3. 备份user1定时任务:crontab –l > cron_bak/`whoami`_`date +’%Y%m%d’`.txt
#注:user1_20220526.txt生成在/home/user1/cron_bak路径下
4. 查看user1备份文件:cat user1_20220526.txt
#定时任务全部被保存在user1_20220526.txt文件中
5. 用以上方法备份root用户下定时任务。
6. 进入root用户:su
#注:可使用用sudo su,但需要拥有针对单个命令授予临时权限。su操作root用户权限较高,使用时需注意。
7. 输入密码:
8. 备份root定时任务:crontab –l > `whoami`_`date +’%Y%m%d’`.txt
#注:root_20220526.txt生成在/home/user1/cron_bak路径下
9. 查看root备份文件:cat root_20220526.txt
10. 退出root用户:exit
3.2、shell脚本每日自动备份定时任务:(root用户的定时任务下,每日8:30执行)
1、创建cron_bak文件夹:(保存备份定时任务文件、定时任务备份脚本)
mkdir /home/user1/cron_bak
2、创建备份定时任务脚本、或创建后直接编辑:
touch /home/user1/cron_bak/cron_bak.sh
vim /home/user1/cron_bak/cron_bak.sh
3、编辑cron_bak.sh内容:
#!/bin/bash
# 每天对crontab 进行备份,同时删除7天前的数据
crontab -l -u root> /home/edauser/cron_bak/root_`date +’%Y%m%d’`.txt
crontab -l -u user1> /home/edauser/cron_bak/user1_`date +’%Y%m%d’`.txt
find /home/edauser/cron_bak/ -mtime +7 -name '*_*.txt' -exec rm -rf {} \;
4.1、保存退出:先按Esc键,后输入
:wq
4.2、不保存退出:先按Esc键,后输入
:q!
5、为shell脚本添加可执行权限:
chmod +x /home/user1/cron_bak/cron_bak.sh
#添加完权限可通过ll查看文件权限。
6、为root用户添加该shell脚本定时任务:(每天8:30执行)
1、crontab -e
2、i
3、30 8 * * * /home/user1/cron_bak/cron_bak.sh
4、:wq
注1:禁止直接修改var/spool/cron/edauser或root。因为定时任务进程不止在这一个位置配置执行周期。
注2:备份脚本只能在root用户下执行,普通用户无-u权限。
四、恢复方案:
4.1 利用备份恢复:(首选方案)
1.复制/home/user1/cron_bak目录下最新一天的备份到本地: root_日期.txt、user1_日期.txt。
2.复制备份内容。
3.进入root用户下:
1:进入编辑模式:crontab -e
2:编辑内容:i
3:编辑定时任务:右击鼠标->粘贴(剪贴板里复制的是“root_日期.txt”内容)
4:退出:按“Esc”退出编辑模式
5:保存::wq(不保存::q!)
4.进入user1用户下:
1:进入编辑模式:crontab -e
2:编辑内容:i
3:编辑定时任务:右击鼠标->粘贴(剪贴板里复制的是“user1_日期.txt”内容)
4:退出:按“Esc”退出编辑模式
5:保存::wq(不保存::q!)
5.检查定时任务是否保存成功:
crontab –l
6.检查定时任务设置的程序是否启动。D
4.2 利用log恢复(不建议、比较麻烦、网上找的、没试过、有兴趣自己研究)
1、获取完整日志、cmd日志:从日志中恢复出一份最近几天的完整crontab 运行日志和cmd日志,并存储,用于之后完善和核准例行时间。
cat /var/log/cron | grep -i "`which cron`" > ./all_temp
cat ./all_temp | grep -v "<command>” > ./cmd_temp
2、获取所有crontab指令:从日志中恢复一份去重的crontab log。相当于所有的crontab命令。
awk -F'(' '/crond/{a[$3]=$0}END{for(i in a)print a[i]}' /var/log/cron* >crontab.txt
awk -F'(' '{if($0~/CROND/){a[$3]=$0}}END{for(i in a){print a[i]}}' /var/log/cron >cron_bak.txt#去重的log,带log最后一次运行时间
awk -F'(' '{if($0~/CROND/){a[$3]=$0}}END{for(i in a){print i}}' /var/log/cron >cron_bak.txt#去重的crontab
或 cat /var/log/cron | grep -i "root" | grep "CMD" | awk -F '(' '{print $3}' | awk -F ')' '{print $1}' | sort -u # sort -u=sort unique也是去重的crontab
awk -F'(' '{if($0 ~ /AOILoader.py/){print $1}}' log.txt
3、手工恢复:awk -F
从crontab.txt 中找出每一条指令,然后在cmd_temp 中匹配运行次数,重新编辑crontab 添加。
awk -F'(' '{if($0~/AOILoader.py/){print $1}}' log.txt
五、其他知识
1、查看服务器所有用户下的定时任务:
for u in `cat /etc/passwd | cut -d ":" -f 1` ; do crontab -l -u $u ; done
注:一定要注意分号,结尾写done,如忘记写,系统会出现“>”提示,届时输入done回车即可执行。
注:for 循环中遍历的数据集合需要通过``引用,相当于命令中嵌套命令。
使用变量时:需${}引用,代表变量,花括号帮助解释器识别边界。为变量赋值时,无需$引用。
for file in `ls /etc`或者 for file in $( ls /etc)
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
readonly 变量名:常量。
unset 变量名:删除变量。
注:有的用户没有定时任务,系统会提示:no crontab for "username"
注:cat: 查看文件内容;
| :管道符,将管道前结果赋予管道后
cut:切割字符串,-d 后是分隔符,-f 后是返回的分割后值的位置,1开始
注:具体的功能通过命令查看:cut --help、cat --help
示例:for i in `cat /etc/passwd | cut -d ":" -f 1` ; do echo $i"-----------:" >> alluser_cron_bak.txt; crontab -l -u $i >> alluser_cron_bak.txt; done
2、编辑文件,文件保存,取消保存:
保存::wq
取消保存::q!
3、待执行程序必须具有x【可执行】权限:
r:读权限【4】
w:写权限【2】
x:可执行权限【1】
编辑权限的方法:chmod +x path/file.txt
八进制权限:0777(7=4+2+1=读写可执行)
4、awk:
【原理】:逐行读取文本,默认以空格或tab键位分隔符进行分隔,将分隔符所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后处理。
awk信息的读入也是逐行读取,执行结果可通过print功能将字段数据打印显示。
使用awk时:可用逻辑操作符“&&”(与)、“||”(或)、“!”(非);
可用数学运算:+、-、*、/、%、^(加、减、乘、除、取余、乘方)
【格式】:awk 选项 '模式或条件{操作}' 文件1 文件2 ……
awk -f 脚本文件 文件1 文件2 ……
【内建变量&作用】:
FS:列分割符。指定每行文本的字段分隔符,默认空格或制表位。与"-F"作用相同。
NF:当前处理的行的字段个数(总列数)
NR:当前处理的行的行号(序数)
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段{第n列}
FILENAME:被处理的文件名
RS:行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多记录。awk一次仅读入一条记录,以进行处理。预设值是'\n'
【文本输出】:
按行输出:awk '{print}' a.txt 或 awk '{print $0}' a.txt
输出第1-3行数据:awk ' NR==1,NR==3{print}' a.txt 或 awk '(NR>=1)&&(NR<=3){print}' a.txt
输出奇数行:awk '(NR%2)!=0{print}' a.txt
输出偶数行:awk '(NR%2)==0 {print}' a.txt
输出etc/passwd中以'nologin'字符结尾的行:awk '/nologin$/{print}' /etc/passwd
输出etc/passwd中以'/bin/bash结尾的行'awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd
BEGIN模式:处理文本前先执行BEGIN模式中的指定动作;
awk:再处理指定文本,之后再执行END模式中指定的动作;
END模式:打印结果。
输出每行第3个字段(以空格/制表位分隔):awk -F ":" '{print $3}' /etc/passwd
输出每行第1、第3个字段:awk -F ":" '{print $1,$3}' /etc/passwd
输出第3个字段的值小于5的第1、3个字段的内容:awk -F ":" '$3<5{$1,$3}' /etc/passwd
先处理BEGIN内容,再打印文本:awk 'BEGIN{FS=":"};{if($3>=1000){print}}' /etc/passwd
使用三元运算符,取第3、4列中的最大值:awk -F":" '{ max=($3>=$4)?$3:$4;{print max} }' /etc/passwd

浙公网安备 33010602011771号