定时任务,用于执行在Linux中的重复性工作。如:命令(同步系统时间),脚本(备份,系统巡检)。
服务使用流程:
部署;
配置,如何使用这个服务通过配置文件,通过命令,初级使用:能用就行;提高:额外的配置;
优化或注意事项:安全......
排障:难点;1,通过错误提示解决,2,学会去看日志;3,高级:让服务输出错误提示或输出更加详细的错误提示(通过重定向);
其他:1,做好监控,2,做好备份,3,做好日志收集;4,统一认证;
======================================================================
概述:
定时任务软件包名字:cronie,服务名字(进程)crond:
[root@web01 ~]# rpm -qa cronie
cronie-1.4.11-23.el7.x86_64
# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/usr/share/doc/cronie-1.4.11
/usr/share/doc/cronie-1.4.11/AUTHORS
/usr/share/doc/cronie-1.4.11/COPYING
/usr/share/doc/cronie-1.4.11/ChangeLog
/usr/share/doc/cronie-1.4.11/INSTALL
/usr/share/doc/cronie-1.4.11/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron
----------------------------------------------------------------------------------------------------------
目录结构:
rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond //这几个不用管
用户的配置文件的目录:
/var/spool/cron //用户的定时任务的配置文件的目录
/etc/crontab //不推荐使用这个,系统定时任务的配置文件
比如:
/var/spool/cron/mclind
用crontab这个命令来编辑这个目录文件
日志文件:/var/log/cron
可以了解下面的配置文件:
[root@web01 ~]# ls -ld /etc/cron.*
drwxr-xr-x. 2 root root 36 12月 7 19:34 /etc/cron.d
drwxr-xr-x. 2 root root 42 12月 6 07:41 /etc/cron.daily //系统定时任务,每天运行
-rw-------. 1 root root 0 8月 9 2019 /etc/cron.deny
drwxr-xr-x. 2 root root 22 12月 6 07:41 /etc/cron.hourly //系统定时任务,每小时运行
drwxr-xr-x. 2 root root 6 6月 10 2014 /etc/cron.monthly //系统定时任务,每小时运行
drwxr-xr-x. 2 root root 6 6月 10 2014 /etc/cron.weekly //系统定时任务,每周运行
======================================================================
使用指南
检查是否运行、开机自启动
# systemctl status crond
============
crontab用于定时任务的规则进行增删改查。
选项:
-e:编辑当前用户的定时任务,相当于在vi /var/spool/cron/root(root为当前用户名);
-l:查看当前用户的定时任务,相当于在cat /var/spool/cron/root(root为当前用户名);
-u:指定用户名;
-r:清空当前用户的定时任务;无提示;
-i:清空定时任务之前作提示;
输入crontab -e,即可进入编辑模式,和vim类似;
格式:
* * * * * 命令
分 时 日 月 周 comand to be executed
分:0-59
时:0-23
日:1-31
月:1-12
周:0-6,0或7都代表周日,1-6代表周一到周六;
======================================================================
案例:每天早上8:30分,去学校
#1,test01 //这是注释
30 8 * * * go to school
晚上12点上床睡觉
* 00 * * * go to bed
00 00 * * * go to bed
//这两种有什么区别?
//第一种,每天的半夜12点,每分钟都go to bed;
//第二种,每天半夜12点,00分,go to bed一次;
//综上,涉及到小时,天,周几的时候,分钟位置上记得写个数(比如00),多少都行;
----------------------------------------------------------------------------------------------------------
定时任务部分的特殊符号:
/:斜线,每隔XX时间,比如:*/2 * * * *,每2分种;
-:减号,表示范围,比如:00 8-18/2 * * *,8点到晚上18点期间每2个小时;
,:逗号,独立的一些时间,比如:00 8,9,12,14,18 * * *,8,9,12,14,18点,只有这几个;适用于没规律的时候;
----------------------------------------------------------------------------------------------------------
接着找案例:
每天早7点到晚11点,每2个小时运行cmd命令
00 07-23/2 * * * CMD
1)每2分钟同步系统时间,命令要使用绝对路径,输出清空:
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null
写好之后要调试(测试,检查 )(这里可以先修改一下时间,看能否同步)(date -s '20221111 11:11:11'
1,日志:看是否运行(定时任务日志,只能提示是否运行了,但无法告知是否成功,tail -f /var/log/cron);
2,结果:查看定时任务的结果(时间是否修改,压缩包是否生成);
----------------------------------------------------------------------------------------------------------
为什么要用crontab -e编辑定时任务,而不是直接编辑文件呢?因为crontab -e,在保存时候,还有语法检查的功能;
定时任务书写流程:
1,分析要求需要使用什么命令并调试;
2,书写脚本(命令较多,功能复杂)与调试;
3,书写定时任务的配置文件(绝对路径,定向到空)
4,调试;
======================================================================
案例:02,每天定时备份/etc/到/backup/下面
备份时间:业务低谷期,比如凌晨1点备份;
命令:tar命令;
脚本:命令大礼包 .sh .bash结尾;
定时任务配置:
命令:
mkdir -p /backup/ //这只用创建一次
tar zcf /backup/etc-`date +%F`.tar.gz /etc/
脚本:
专用脚本目录:(自己规划,备份放哪,脚本放哪,软件包放哪)
mkdir -p /server/scripts
cd /server/scripts
vim backup-etc.sh //名字,建议见名知义
以下是脚本内容:
tar zcf /backup/etc-`date +%F`.tar.gz /etc/
脚本内容完毕,对,只有这一行,就是上面执行的一行;
sh /server/scripts/backup-etc.sh //执行脚本
书定定时任务:
#2,这是一个定时备份/etc/目录任务,by root at Xxxx
00 01 * * * /bin/sh /server/scripts/backup-etc.s >/dev/null 2>&1
//一开始测试,可以设置频率高一点,比如每分钟,没问题了,可以设置正常要求时间;
tail -f /var/log/cron //查看日志检查
watch ls -l //watch,每2秒运行一下命令,这就是方便检查,不用一次交敲命令
======================================================================
脚本与变量:
变量,可以改变的量,在脚本中可以重复使用;
a = 'asdf'
echo $a //变量取值
dir=/server/scripts/
file=backup-etc.sh
echo $dir$file
脚本开头:建议加上#!/bin/bash,这是一个说明;
对以上脚本改写:
#脚本开始
#!/bin/bash
#定义变量
time=`date +%F_%w`
tar zcf /backup/etc/-$time.tar.gz /etc/
#至此脚本改完;;
======================================================================
======================================================================
定时任务注意事项(箴言)
1)增加注释;
2)尽量使用脚本;
3)定时任务的文件,脚本使用绝对路径;
4)命令使用绝对路径;
5)定时任务中执行的命令或脚本定向到空或追加到文件;
==========================
定时任务关于命令路径的故障:
现在:手动执行或脚本执行是好的,但放定时任务就提示命令不存在;command not found/no such file or directory
在定时任务运行命令或脚本的时候,只能识别到/bin或者/usr/bin目录下面的命令;
只要不在这些目录下面的命令,就要使用绝对路径或者重新定义下PATH;
PATH,Linux环境变量,存放命令的位置(路径),以冒号:分隔;查看命令:echo $PATH;
解决方案:
使用绝对路径,或者在脚本开头,重新加载PATH变量;
======================================================================
脚本中重新加载PATH
#!/usr/bin
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin //重新定义
source /etc/profile //重新加载PATH环境变量,这两种都可以,source也可以写成.
ip a s eth0
ifconfig eth0
======================================================================
定时任务没有定向到空或追加到文件故障案例
现象:
邮件服务开启: 不断收到邮箱 You have new mail in /var/spool/mail/root
邮件服务关闭: 一些邮件的临时目录不断堆积小文件. /var/spool/postfix/maildrop
原因:
定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件形式发送给root.
解决:
定时任务中命令或脚本定向到空或追加到文件.
#定向到空
#1. 同步时间
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com
#追加到文件
#4. echo
* * * * * echo hello >> /tmp/lidao.txt 2>&1
#2. 定时备份 /etc/ 目录
00 01 * * * /bin/sh -x /server/scripts/backup-etc.sh &>> /tmp/script.log
======================================================================
案例:用脚本(使用变量)定时备份 /etc/ 目录
# cat backup-v1.sh
#!/bin/bash
#author: mclind
#desc: backup etc add ip
#version: v1
#变量
ip=`hostname -I | awk '{print $1}'`
time=`date +%F_%w`
#dir=/backup/$ip
#full_file=$dir/etc-$time.tar.gz
#操作
mkdir -p /backup/$ip
tar zcf /backup/$ip/etc-$time.tar.gz /etc/
//至此,脚本写完,下面写定时任务 ,命令行输入crontab -e开始:
# 备份/etc/目录,by mclind 20230101
00 00 * * * /usr/bin/sh /server/script/backup.sh >>/dev/null 2>&1
//书写完毕,搞定
======================================================================
发送邮件:在Linux上,找一个源邮箱,发给目标邮箱。
步骤:
1、先找源邮箱的授权码,并打开SMTP,以126邮箱为例:
登录邮箱,找到 “设置”,打开 “POP3/SMTP/IMAP” ,开启服务哪里,开启IMAP/SMTP服务和POP3/SMTP服务,默认是关闭的,开启需要手机发送一条短信;
2、配置linux mail.rc配置发件人信息
# vim /etc/mail.rc #下面内容写到最后
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
set from=username@126.com //配置发件人
set smtp=smtps://smtp.126.com:465 //配置使用126发送邮件
set smtp-auth-user=username@126.com //用户名,邮箱名字,如果
set smtp-auth-password=KNDDCBTLVJISZJGN //授权码
set smtp-auth=login //认证形式login
set nss-config-dir=/etc/pki/nssdb/ //这3行用于配置加密方式传输,不加密方式不用配
set smtp-user-starttls //这3行用于配置加密方式传输,不加密方式不用配
set ssl-verify=ignore //这3行用于配置加密方式传输,不加密方式不用配
//内容写完了,接着就可以发送邮件测试了
# mail -s 'test' 2312823999@qq.com < haha.txt //这是发邮件命令,但会有一个错误提示:从下一行开始
//Error in certificate: Peer's certificate issuer has been marked as not trusted by the.
//这个,是配置加密方式发送邮件错误,因为加密,所以需要认证,传输时候缺少文件或证书认证,就报错了。
下面附上解决方法,就是执行下面内容即可(在命令行直接粘贴执行也可以,放shell脚本执行也可以)
echo -n | openssl s_client -connect smtp.126.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/nssdb/126.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/126.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/126.crt
certutil -L -d /etc/pki/nssdb/
cd /etc/pki/nssdb/
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 126.crt
//至此,解决方案的命令完,再次发送邮件,就不会报错了,
----------------------------------------------------------------------------------------------------------
如果发邮件想要附上附件,也可以加参数-a
# mail -s 'test' -a haha.txt 2312823999@qq.com < haha.txt
----------------------------------------------------------------------------------------------------------
上面配置的是加密发邮件,也可以不用加密码方式:
set from=username@163.com
set smtp=smtp.163.com
set smtp-auth-user=username@163.com
set smtp-auth-password=BGRCTL CZXIT
set smtp-auth=login
======================================================================
脚本如何输出表格?一般用开发语言生成,这里我不会,就用csv格式糊弄一下了~~
在脚本里,用echo输出到表格,但有一点,输出格式需要调一下;
echo "主机名,${hostname}" //在echo输出的语句里,用逗号分隔,就形成了csv格式文件,这就是一行
echo "IP,${ip}" // 这是另一行,这里只能输出内容,没有excel里边的函数等功能
//下面就不写了,就这俩测试一下看看就可以了。
# sh /server/script/csvtest.sh > test.csv //这就生成了,可以拉到windows下使用查看