3.执行计划任务,沉静输出
4.储存备份内容,要求只保留七天的数据
vim /opt/backup.sh
#!bin/bash
# 声明环境变量
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/tom/.local/bin:/home/tom/bin
# 存放目录
DIR=/opt/backup
# 判断目录是否存在,不存在则创建
if [ ! -d ${DIR} ];then
mkdir -p ${DIR}
fi
# 取ip与主机名和时间
IP=`ifconfig | grep 'inet ' |awk 'NR==1{print $2}'`
HOSTNAME=$(hostname)
DATE=$(date +%F)
TIME=$(date +%T)
# 打包
cd / &&
tar czf ${DIR}/${DATE}_${TIME}_${HOSTNAME}_${IP}.etc.tar.gz /etc/ &>/dev/null
# 查找大于三天的文件删除
find ${DIR} -type f -mtime +3 -name '*.tar.gz' |xargs -I {} rm -rf {}
创建定时任务
[root@localhost opt]# crontab -l
#每天00:00执行/opt/backup.sh脚本进行备份
00 00 * * * /bin/bash /opt/backup.sh &>/dev/null
也可以写如下简单版的脚本
#!bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 防止下述命令出问题
cd /
tar -czf backup/$(hostname)_$(date +%F_%T)_etc.tar.gz /etc
find backup -type f -name "*.tar.gz" -mtime +3 |xargs rm -rf
[root@localhost ~]# crontab -l
* * * * * /bin/bash /root/bak.sh &>/dev/null
我们也可以把定时任务执行过程追加到一个文件中诸如/tmp/email.log,之后再创建一个定时任务定时读取文件内容发送到自己的邮箱。这样,就直接在邮箱中可以听到。
四、定时任务结合发送短信
将定期打包的执行过程发送到指定电邮。
1.首先修改前面的定时任务
#每天00:00执行/opt/backup.sh脚本进行备份
00 00 * * * /bin/bash -x /opt/backup.sh &>>/tmp/email.log # -x参数是显示执行过程。
2.其次创建发送短信脚本
[root@localhost ~]# vim /opt/send_email.sh
mail -s "主题(定时任务执行情况)" 收件地址@163.com</tmp/email.log
# 赋予执行权限
[root@localhost tmp]# chmod +x /opt/send_email.sh
# 解释
1、无邮件正文发送情况
mail -s "主题" 收件地址
echo "内容" | mail -s "主题" 收件地址
2、有邮件正文:
mail -s "主题" 收件地址<文件
echo "邮件正文" | mail -s 邮件主题 收件地址
cat "邮件正文" | mail -s 邮件主题 收件地址
3、带附件
mail -s "主题" 收件地址 -a 附件 <文件地址
3.更改配置文件/etc/mail.rc
# 首先需要安装
[root@localhost ~]# yum install sendmail
[root@localhost ~]# yum install mailx
# 修改配置文件
#开启ssl
# 下方填入你配置的第三方smtp服务器的地址及端口,如果使用的是云服务器,安全组需要开放465端口(入口和出口)
set ssl-verify=ignore
#下方输入证书目录,下方为centos系统证书默认位置,也自行生成证书并指定
set nss-config-dir=/etc/pki/nssdb
set smtp=smtps://smtp.qq.com:465
# 认证方式
set smtp-auth=login
# 下方输入用于发送邮件的邮箱账号,即发送方邮件
set smtp-auth-user=XXX@qq.com
# 下方输入上方邮箱的客户端授权码
set smtp-auth-password=授权码
# 设置发信人邮箱和昵称,即发送方邮箱
set from=XXX@qq.com
qq邮箱授权码获取qq邮箱授权码获取
登录邮箱点设置----->帐户------->下拉开启下边的服务点击生成授权码
报错:Errorincertificate:Peer’scertificateissuerhasbeenmarkedasnottrustedbythe.
解决办法:
mkdir -p /root/.certs/ ##先创建这个文件夹
复制这段到文件中
echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -L -d /root/.certs
# 然后切换到./certs目录执行如下命令
cd /root/.certs
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt
# 再次编辑/etc/mail.rc文件,更改如下即可
#set nss-config-dir=/etc/pki/nssdb/
set nss-config-dir=/root/.certs
五、crontab不执行的问题
第一,脚本的缘由:大多数情况下,我们要相信科学,相信计算机,不是有鬼,就是我们的脚本的问题,这些问题引起crontab不能执行的机率占到70%以上。由于程序执行到某一步引致crontab中止执行,我就遇到一次在迁移代码的时侯将数据库连错了。造成难以访问而死在哪里了。
第二红旗linux6.0,执行环境问题,当我们见到第一情况下,通常都可以通过自动执行程序将问题抹杀在摇篮里,通常情况下大神是不应当犯第一种错误的。问题是当我们自动执行成功而crontab不能执行的时侯,笔者遇到一次就是执行环境的问题,比如相关路径的设置问题。解决方案:在代码最上面执行source/home/user/.bash_profile
第三,系统时间不正确。这些问题最好理解,也是比较常见和隐蔽的问题,解决方案:date-s********
第四,就是我们的脚本是否有可执行权限。必须保证执行脚本的用户有执行改文件的权限。
第五,crontab守护进程挂掉了。这些情况是很少发生的,但也不排除,当我们实在是找不到其他缘由的时侯可以用。解决方案:重启该进程。
第六,crontab不执行的问题困惑了好长时间,脚本写的都正确,而且就是不执行,最终解决方式如下:
crontab -u root /var/spool/cron/root
这样root用户的crontab就生效了
[root@localhost ~]# systemctl restart crond
重启下服务就好了
第七,crond没有启动
[root@localhost~]#systemctlrestartcrond
第八linux基础教程,脚本编码问题,脚本在window下编撰,传到linux下后报“锘?!/bin/bash”,
用vi编辑器新建新shell脚本,输入内容后保存。
第九
*****tarczf/tmp/date'+%Y'/etc该计划任务中命令的执行流程是crond->tar命令linux 计划任务,
而crond在执行tar命令时,难以辨识键值%的意思(shell能辨识),所以该命令未能正常执行
改正结果:*****tarczf/tmp/date'+%Y'/etc
一般还会把要执行的操作放在文件中,之后/bin/basha.sh去执行,*****/bin/basha.sh,
这样的执行流程就弄成了crond->bashshell->a.sh,这样a.sh内虽然是写%号,也能被辨识下来
六、定时任务练习
1.每分钟复印你的名子到who.txt中。
[root@localhost ~]# cat print.sh
#!/bin/bash
user=`whoami`
echo $user >> /tmp/who.txt
[root@localhost ~]# crontab -l
* * * * * /bin/bash /root/print.sh
[root@localhost ~]#
2.每周一的早晨9点到12点,执行/scripts/test.sh脚本。
[root@localhost ~]# crontab -l
* 9-12 * * 1 /bin/bash /scripts/test.sh
3.每位月的1号,执行/scripts/test.sh脚本
[root@localhost ~]# crontab -l
* * 1 * * /bin/bash /scripts/test.sh
4.每年的11月份1号到7号,执行/scripts/holiday.sh脚本
[root@localhost ~]# crontab -l
* * 1-7 11 * /bin/bash /scripts/holiday.sh
5.每晚的9点和11点,执行/scripts/test.sh脚本
[root@localhost ~]# crontab -l
* 9,11 * * * /bin/bash /scripts/test.sh
七、拒绝特定用户使用定时任务
crond怎样拒绝某个用户使用
使用root将须要拒绝的用户加入/etc/cron.deny
1. 将jack加入
[root@localhost ~]# echo "jack" >> /etc/cron.deny
[root@localhost ~]# su - jack
Last login: Fri Jul 23 23:45:59 CST 2021 on pts/0
2.测试jack是否能够使用定时任务
[jack@localhost ~]$ crontab -e
You (jack) are not allowed to use this program (crontab)
See crontab(1) for more information
[jack@localhost ~]$
八、定时任务编撰思路
1.自动执行命令,之后保留执行成功的结果。
2.编撰脚本
脚本须要统一路径/scripts脚本内容复制执行成功的命令(降低每位环节出错概率)
3.执行脚本
使用bash命令执行,避免脚本没有降低执行权限(/usr/bin/bash/bin/bash)执行脚本成功后,复制该执行的命令,便于写入cron
4.编撰定时任务
加上必要的注释信息,人、时间、任务
设定定时任务执行的周期
粘贴执行脚本的命令(不要手敲)
5.调试定时任务
降低任务频度测试
检测环境变量问题(最好在脚本中重新定义环境变量PATH)
检测crond服务日志
九、计划任务备份
因为所有的计划任务编撰完毕后都储存至
/var/spool/cron/{usernmae}
文件中,所以只须要cp该文件即可。
假如计划任务没有备份,还不留神执行了crontab-r命令
1.通过查找/var/log/cron中执行的记录linux 计划任务,之后过滤与CMD相关的内容行;
2.通过执行任务的时间推测执行的频度;
十、总结
1.定时任务规则之前加注释
2.使用脚本执行定时任务(只有一条简单命令的可以直接使用命令执行)
3.运行脚本一定要用绝对路径执行,统一脚本位置。
4.定时任务中date命令的百分号需通配符能够使用。
5.命令或脚本结果(正确及错误)定向到空(>/dev/null2>&1)或追加到文件中>>/tmp/oldboy.txt2>&1
6.防止毋须要的程序及命令输出,如打包命令,tar-v的显示过程的选项。
7.打包压缩使用相对路径(切到目标目录的上一级打包目标)
8.定时任务脚本中的程序文件,尽量用绝对路径,用户的定时任务中的文件默认储存在当前用户的家目录
9.系统与命令位置有关的环境变量问题,建议脚本中重新定义环境变量PATH。