Linux定时任务
Linux定时任务
1.定时任务概述
- 定时任务:类似于我们闹钟,定时任务一般用于定期(分钟,小时,天)运行任务。
- 一般用于运行重复性任务或工作.
2.应用场景
所有重复性的工作,都交给定时任务.
1.定时同步时间ntpdate
2.定时备份
3.定时巡检
4.其他的定时或重复需求
3.定时任务使用
3.1 检查是否安装定时任务
rpm -qa | grep cron
定时任务软件 | |
---|---|
CentOS 7.x | cronie-1.4.11-23.el7.x86_64 |
麒麟V10 | cronie-1.5.5-2.ky10.x86_64 |
Ubt | cron 3.0 |
Debian | cron 3.0 |
3.2 检查是否运行
[root@Kylin-V10-sp3 ~]# ps -ef | grep crond
root 876 1 0 9月10 ? 00:00:00 /usr/sbin/crond -n
root 13100 12517 0 08:20 pts/2 00:00:00 grep --color crond
[root@Kylin-V10-sp3 ~]#
#是否正在运行
[root@Kylin-V10-sp3 ~]# systemctl is-active crond
active
[root@Kylin-V10-sp3 ~]#
#是否开机自启动
[root@Kylin-V10-sp3 ~]# systemctl is-enabled crond
enabled
3.3 尝试查看与修改配置
# 通过命令配置(自带检查功能)
crontab -l # 查看 ls list
crontab -e # 修改 edit
#cron table 定时任务配置表
# 通过修改配置文件(无法检查)
crontab -e --> vi /var/spool/cron/root # root当前用户名字
crontab -l --> cat /var/spool/cron/root # root当前用户名字
# ubt中:crontab -e 需要选择编辑器 选择vim.basic 2号 ,后期可以使用select-editor修改
[root@ubuntu2204 ~]# select-editor
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]: 2
[root@ubuntu2204 ~]#
3.4 定时任务相关文件
定时任务相关的配置文件 | 说明 |
---|---|
/var/spool/cron/root ⭐ ⭐ ⭐ ⭐ ⭐ | 核心使用的配置文件 |
/etc/crontab | 较少使用,也是配置文件 |
/etc/cron.daily/ | 系统,每天的定时任务 |
/etc/cron.hourly/ | 每个小时 |
/etc/cron.weekly/ | 每周 |
/etc/cron.monthly/ | 每个月 |
日志切割(日志轮询):防止单个日志过大,对日志定期进行切割.
3.5 定时任务配置格式详解 ⭐⭐⭐⭐⭐
- 注意:定时任务配置1行就是配置的1个任务.
- 定时任务格式:2个部分
🅰 指定时间
🅱 指定命令或脚本
# 每天早上8:30分 去学校(go to school)
30 08 * * * go to school 1
# 晚上12点上床睡觉 go to bed
00 00 * * * go to school 1
3.6 定时任务中的特殊符号 ⭐⭐⭐⭐⭐
这些符号一般用于更加精确控制时间:每3分钟执行xxx命令,8-14点运行xxx.
定时任务配置文件中的特殊符号 | 说明 | 案例 |
---|---|---|
* ⭐ ⭐ ⭐ ⭐ ⭐ | 每,每隔 */2 |
每隔2分钟运行cmd命令: */2 * * * * cmd 每隔2个小时运行用户命令: 00 */2 * * * uname |
- ⭐ ⭐ ⭐ ⭐ ⭐ | 范围 | 每天10-22点运行cmd: 00 10-22 * * * cmd |
,(逗号) ⭐ ⭐ | 独立,没有规律 | 每天9,15,22运行cmd : 00 09,15,22 * * * cmd |
每天的上午7点到上午11点每一个小时运行CMD命令
00 07-11 * * * CMD
#每隔两个小时
00 07-11/2 * * * CMD
#增加15点运行
00 07-11,15 * * * CMD
00 07-11/2,15 * * * CMD
4.定时任务案例
书写流程:
- 1.根据需求找出对应的命令或书写脚本.
- 2.调试命令或脚本.
- 3.书写定时任务配置.
- 4.调试检查结果 🅰 定时任务的日志 🅱 命令或脚本结果. ⭐ ⭐ ⭐ ⭐ ⭐
4.1 每隔2分钟同步时间 ⭐⭐⭐⭐⭐
# 第1个里程碑-找出命令与调试
[root@Kylin-V10-sp3 ~]# /sbin/ntpdate ntp.aliyun.com
11 Sep 08:53:59 ntpdate[13197]: adjust time server 203.107.6.88 offset +0.001553 sec
[root@Kylin-V10-sp3 ~]#
# 第2个里程碑-修改定时任务配置文件
[root@Kylin-V10-sp3 ~]# crontab -l
#author:xk
# update time
*/2 * * * * /sbin/ntpdate ntp.aliyun.com >>/dev/null 2>&1
# bak /etc/ /var/spool/cron
#* * * * * bash /server/scripts/01-bak.sh >>/var/log/cron_test.log 2>&1
#* * * * * bash /server/scripts/02-test-path.sh >>/var/log/cron_test.log 2>&1
[root@Kylin-V10-sp3 ~]#
# 第3个里程碑-检查结果
[root@Kylin-V10-sp3 ~]# tail -f /var/log/cron
Sep 11 09:02:57 Kylin-V10-sp3 CROND[13265]: (root) CMDEND (/sbin/ntpdate ntp.aliyun.com >>/dev/null 2>&1)
Sep 11 09:04:01 Kylin-V10-sp3 CROND[13293]: (root) CMD (/sbin/ntpdate ntp.aliyun.com >>/dev/null 2>&1)
Sep 11 09:04:18 Kylin-V10-sp3 CROND[13288]: (root) CMDEND (/sbin/ntpdate ntp.aliyun.com >>/dev/null 2>&1)
# 修改时间
[root@Kylin-V10-sp3 ~]# date -s '20240101'
2024年 01月 01日 星期一 00:00:00 -03
[root@Kylin-V10-sp3 ~]# date
2024年 01月 01日 星期一 00:00:06 -03
[root@Kylin-V10-sp3 ~]#
定时任务书写流程:
- 根据需求选择命令或书写脚本,测试.
- 命令,脚本写入到定时任务中(crontab -e)
- 检查: 🅰 检查执行结果 🅱 看日志/var/log/cron
4.2 备份案例⭐⭐⭐⭐⭐
需求:/etc/,/var/spool/cron/目录备份到/backup/下面,压缩包bak-conf-2023-01-01-周几.tar.gz
- 所有服务器的时间要一致.
- 避免手动修改时间,线上,生产环境禁止.
4.2.1 备份类项目-基本 ⭐⭐⭐⭐⭐
打包备份 /etc/,/var/spool/cron/目录备份到/backup/下面,压缩包bak-conf-2023-01-01-周几.tar.gz
完整的备份脚本:
-
正常打包备份,压缩包上加上时间,周几.
-
清理旧的备份(find+rm)
-
书写脚本.
-
涉及到脚本变量,反引号.
-
脚本变量,反引号.
-
find清理旧的备份..
第1个里程碑-测试命令与书写脚本
点击查看代码
# 测试命令
mkdir -p /backup/
tar zcf /backup/bak-conf-`date +%F_%w`.tar.gz /etc/ /var/spool/cron/
# 书写脚本
[root@Kylin-V10-sp3 /server/scripts]# cat /server/scripts/01-bak.sh
#!/bin/bash
# 1.vars
date=`date +%F_%w`
file_dir= /backup/
package=${file_dir}conf_$date.tar.gz
# 2.content
mkdir -p /backup/
tar zcf ${package} /etc/ /var/spool/cron/
[root@Kylin-V10-sp3 /server/scripts]#
# 执行与调试脚本
[root@Kylin-V10-sp3 /server/scripts]# bash /server/scripts/01-bak.sh
/server/scripts/01-bak.sh:行5: /backup/:是一个目录
tar: 从成员名中删除开头的“/”
tar: 从硬连接目标中删除开头的“/”
[root@Kylin-V10-sp3 /server/scripts]#
[root@Kylin-V10-sp3 /server/scripts]#
[root@Kylin-V10-sp3 /server/scripts]# tree /backup/
/backup/
├── conf_2024-09-11_3.tar.gz
└── etc_cron_2024-09-11_3.tar.gz
0 directories, 2 files
[root@Kylin-V10-sp3 /server/scripts]#
第2个里程碑-书写定时任务(每分钟运行)
增加执行的频率,方便调试定时任务.
后面调试完成再改回要求的时间.
# 编写定时任务
[root@Kylin-V10-sp3 /server/scripts]# crontab -l
#user:root
# update time
# */2 * * * * /sbin/ntpdate ntp.aliyun.com >>/dev/null 2>&1
# bak /etc/ /var/spool/cron
* * * * * bash /server/scripts/01-bak.sh >>/var/log/cron_test.log 2>&1
#* * * * * bash /server/scripts/02-test-path.sh >>/var/log/cron_test.log 2>&1
[root@Kylin-V10-sp3 /server/scripts]#
# 看日志
[root@Kylin-V10-sp3 /server/scripts]# tail -F /var/log/cron_test.log
root
05:01:08 up 1 day, 3:08, 3 users, load average: 0.08, 0.02, 0.01
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 02:19 2:41m 0.01s 0.01s -bash
root pts/3 02:19 23:16 0.01s 0.01s -bash
root pts/4 02:20 4.00s 0.08s 0.00s crontab -e
/usr/local/sbin:/usr/sbin:/usr/bin:/bin
/server/scripts/01-bak.sh:行5: /backup/:是一个目录
tar: 从成员名中删除开头的“/”
tar: 从硬连接目标中删除开头的“/”
第3个里程碑-改回指定的时间运行
备份一般在业务低谷期(人少的时候)
这个改为半夜12点整进行备份即可.
[root@Kylin-V10-sp3 ~]# crontab -l
#user:root
# update time
# */2 * * * * /sbin/ntpdate ntp.aliyun.com >>/dev/null 2>&1
# bak /etc/ /var/spool/cron
00 00 * * * bash /server/scripts/01-bak.sh >>/var/log/cron_test.log 2>&1
#* * * * * bash /server/scripts/02-test-path.sh >>/var/log/cron_test.log 2>&1
[root@Kylin-V10-sp3 ~]#
# 小结:
书写脚本与定时任务结合.
尽量多用用变量.
存放时间,存放ip地址,命令结果
存放路径,存放文件名.
变量使用
- 要求:不能以数字开头,包含特殊符号最好是_
#!/bin/bash
#指定命令解释器
#1.vars
date=`date +%F_%w`
bak_dir=/backup/
#2.命令
tar zcf ${bak_dir}conf-${date}.tar.gz /etc/ /var/spool/cron/
变量套娃
#1.vars
date=`date +%F_%w`
bak_dir=/backup/
bak_all=${bak_dir}conf-${date}.tar.gz
#2.备份命令
tar zcf ${bak_all} /etc/ /var/spool/cron/
#3.传输
#scp ${bak_dir} xxxxx
#4.删除旧的备份
#find ${bak_dir} -type f -name "*.tar.gz" |xargs rm -f
4.2.2 完善案例,增加删除旧的备份功能⭐⭐⭐⭐⭐
先打包压缩进行备份.
通过find命令找出7天之前的备份然后删除(相当于保留7天的备份).
# 创建测试文件(1月1号)
'''
0101 0000
月日 时分
'''
[root@Kylin-V10-sp3 ~/test]# touch -m -t 01010000 file-{01..10}.tar.gz
[root@Kylin-V10-sp3 ~/test]# ll
总用量 64
-rw-r--r-- 1 root root 3835 9月 10 03:52 access.log
-rw-r--r-- 1 root root 0 1月 1 2024 file-01.tar.gz
-rw-r--r-- 1 root root 0 1月 1 2024 file-02.tar.gz
-rw-r--r-- 1 root root 0 1月 1 2024 file-03.tar.gz
-rw-r--r-- 1 root root 0 1月 1 2024 file-04.tar.gz
-rw-r--r-- 1 root root 0 1月 1 2024 file-05.tar.gz
-rw-r--r-- 1 root root 0 1月 1 2024 file-06.tar.gz
-rw-r--r-- 1 root root 0 1月 1 2024 file-07.tar.gz
-rw-r--r-- 1 root root 0 1月 1 2024 file-08.tar.gz
-rw-r--r-- 1 root root 0 1月 1 2024 file-09.tar.gz
-rw-r--r-- 1 root root 0 1月 1 2024 file-10.tar.gz
第1个里程碑-书写备份脚本
书写脚本
调试脚本
sh /server/scripts/02-bak-conf-v2.sh
第2个里程碑-书写定时任务(每分钟运行)
- 修改定时任务:* * * * *
- 看日志 tail -F tail /var/log/cron
- 看结果 ll /backup/
第3个里程碑-修改定时任务时间
00 00 * * *
5.定时任务书写注意事项
注意事项 | 说明 |
---|---|
书写定时任务要添加注释 | 一台机器会有多个定时任务,多台服务器批量添加定时任务. |
对于路径推荐使用绝路径 | 文件,目录, 命令?(绝对?定时任务故障案例会说) |
注意定时任务书写流程 | 命令行测试与书写脚本测试 ; 书写定时任务 ;检查结果与修改时间 |
调试 | 增加执行频率 ; 修改系统时间(提前1-2分) |
6.定时任务故障案例
6.1 命令行灵异的提示 ⭐⭐⭐⭐⭐
故障现象
- 一般是centos系统中存在,其他系统中目前没有,但是也要配置下.
- 您在/var/spool/mail/root 中有新邮件
- You have new mail in /var/spool/mail/root 文件邮件.
- 以邮件的形式发送给root用户,命令或脚本执行的输出.
原因
- 定时任务运行命令或脚本的时候,命令或脚本有输出.
- 如果邮件服务开启,这个输出会以邮件的形式发送给root,root收到邮件后会有有这个提示
- 如果邮件服务关闭,邮件无法发送,则憋着,找个目录以小文件的形式存放每次没有发送成功的邮件
- postfix 邮件服务
解决方法:⭐ ⭐ ⭐ ⭐ ⭐
1.命令或脚本输出定向到黑洞,收到内容后就被丢弃.
2.命令或脚本输出定向到某个文件中,方便排查问题.
/dev/null 黑洞文件,特殊文件字符设备
#1. tongbu time by xk at 202311111
*/2 * * * * /sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1
#*/2 * * * * /sbin/ntpdate ntp.aliyun.com &>/dev/null
#2. backup /etc/ crontab conf by xk at 20231111
#00 00 * * * sh /server/scripts/01-bak-conf.sh >/dev/null 2>&1
#3. backup xxxxxxxxxxxxxxxxxx
00 00 * * * sh /server/scripts/02-bak-conf-v2.sh >>/tmp/sh.log 2>&1
6.2 命令行灵异的提示 ⭐⭐⭐⭐⭐
- 现象:
手动运行命令或脚本是没有问题的. 🆗
命令或脚本写入到定时任务就无法运行.❌ - 原因:定时任务运行命令或脚本的时候,命令或脚本中的命令不在/bin/目录下面则
无法识别. 因为PATH变量导致的. - 测试脚本内容
点击查看代码
[root@Kylin-V10-sp3 /server/scripts]# cat 02-test-path.sh
#!/bin/bash
#export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
# source /etc/profile
ntpdate ntp.aliyun.com
ip a s ens33
ifconfig ens33
whoami
w
echo $PATH
[root@Kylin-V10-sp3 /server/scripts]#
[root@Kylin-V10-sp3 /server/scripts]# bash ./02-test-path.sh
11 Sep 04:36:28 ntpdate[9929]: step time server 203.107.6.88 offset +2192.150676 sec
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:8c:ff:3d brd ff:ff:ff:ff:ff:ff
inet 10.0.0.36/24 brd 10.0.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::3596:15a7:b72a:6fee/64 scope link noprefixroute
valid_lft forever preferred_lft forever
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.36 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::3596:15a7:b72a:6fee prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:8c:ff:3d txqueuelen 1000 (Ethernet)
RX packets 51357 bytes 12723269 (12.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 38962 bytes 15058318 (14.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root
04:36:28 up 1 day, 2:43, 3 users, load average: 0.00, 0.00, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 02:19 2:16m 0.01s 0.01s -bash
root pts/3 02:19 2:16m 0.01s 0.01s -bash
root pts/4 02:20 36:44 0.06s 0.00s w
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
[root@Kylin-V10-sp3 /server/scripts]#
[root@Kylin-V10-sp3 /server/scripts]# crontab -l
#user:root
# update time
#*/2 * * * * /sbin/ntpdate ntp.aliyun.com >>/dev/null 2>&1
# bak /etc/ /var/spool/cron
#* * * * * bash /server/scripts/01-bak.sh >>/var/log/cron_test.log 2>&1
* * * * * bash /server/scripts/02-test-path.sh >>/var/log/cron_test.log 2>&1
[root@Kylin-V10-sp3 /server/scripts]#
[root@Kylin-V10-sp3 /server/scripts]#
[root@Kylin-V10-sp3 /server/scripts]# tail -f /var/log/cron_test.log
/server/scripts/02-test-path.sh:行5: ntpdate:未找到命令
/server/scripts/02-test-path.sh:行6: ip:未找到命令
/server/scripts/02-test-path.sh:行7: ifconfig:未找到命令
- 原因:
定时任务运行的时候只能识别:/bin/和/usr/bin/目录下面的内容.其他目录下面的命令无法识别.
定时任务运行的PATH环境变量中只有/bin/和/usr/bin/
PATH环境变量用于存放命令的路径.
ls运行,去PATH路径中查找是否有.
如果有则运行
如果没有则提示command not found
- 解决:
🅰 其他路径的命令写上绝对路径.
🅱 在脚本开头重新定义下PATH环境变量或 source /etc/profile
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
或
source /etc/profile #重新加载profile文件中配置的环境变量比如PATH.
6.3 特殊的%
定时任务中直接运行的命令包含%,%是有特殊含义.
需要通过\转义字符去掉特殊含义.
#5. tar
* * * * * tar zcf /backup/test-`date +\%F_\%w`.tar.gz /etc/ &>/dev/null
7.发送邮件
7.1 数据来源:土味情话
curl "https://api.uomg.com/api/rand.qinghua?format=text"
网站:https://api.uomg.com/doc-rand.qinghua.html
更多的免费的接口:https://api.uomg.com/
7.2 发送测试
7.2.1 麒麟/centos
yum install -y mailx sendmail
mail -s 邮件标题 接收者邮箱 </etc/hosts
echo 666 |mail -s 邮件标题 接收者邮箱
7.3 发送发件人
163邮箱(发件人)开启SMTP服务
163邮箱做为发件人:邮箱,授权码,邮件服务器地址
邮箱:xxx@163.com
授权码:
邮件服务端地址:smtp.163.com
qq收件人
Linux配置/etc/mail.rc postfix服务开启
cat >>/etc/mail.rc <<EOF
set from=xxx@163.com
set smtp=smtp.163.com
set smtp-auth-user=xxx@163.com
set smtp-auth-password=DGKGGXFXYZJQLKMV
set smtp-auth=login
EOF
set from=xxx@163.com # 配置发件人邮箱
set smtp=smtp.163.com # 配置使用163发送邮件 qq邮件服
务器 smtp.qq.com
set smtp-auth-user=xxx@163.com # 用户名:邮箱名字(发件人邮箱)
set smtp-auth-password=授权码 # 授权码,不是邮件的密码,需要登
录邮箱后开启或申请.
set smtp-auth=login # 认证形式login
7.4 书写表白脚本
[root@Kylin-V10-sp3 /server/scripts]# cat email.sh
author: xk
#desc: 每日土味情话
#1.vars
url="https://api.uomg.com/api/rand.qinghua?format=text"
loves="xxx@163.com xxx@qq.com"
echo $mail
curl -s $url |mailx -s "靓仔" $loves
[root@Kylin-V10-sp3 /server/scripts]#
[root@Kylin-V10-sp3 /server/scripts]# crontab -l
#user:root
# update time
# */2 * * * * /sbin/ntpdate ntp.aliyun.com >>/dev/null 2>&1
# bak /etc/ /var/spool/cron
00 00 * * * bash /server/scripts/01-bak.sh >>/var/log/cron_test.log 2>&1
#* * * * * bash /server/scripts/02-test-path.sh >>/var/log/cron_test.log 2>&1
* * * * * bash /server/scripts/06.mail.sh >/dev/null 2>&1
[root@Kylin-V10-sp3 /server/scripts]#
ubuntu 系统邮件
apt update
apt install -y s-nail
vim /etc/s-nail.rc #写入红帽系统中的那些配置
set from=xxx@163.com
set smtp=smtp.163.com
set smtp-auth-user=xxx@163.com
set smtp-auth-password=BGRCTLKQ
set smtp-auth=login
# 使用
s-nail -s test 123456@qq.com </etc/hostname
温馨提示:公有云发送邮件故障与解决方案
https://www.yuque.com/lidao996/sre/iy7cx7o21sxipm4i