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 ~]#

定时任务书写流程:

  1. 根据需求选择命令或书写脚本,测试.
  2. 命令,脚本写入到定时任务中(crontab -e)
  3. 检查: 🅰 检查执行结果 🅱 看日志/var/log/cron

4.2 备份案例⭐⭐⭐⭐⭐

需求:/etc/,/var/spool/cron/目录备份到/backup/下面,压缩包bak-conf-2023-01-01-周几.tar.gz

  1. 所有服务器的时间要一致.
  2. 避免手动修改时间,线上,生产环境禁止.
4.2.1 备份类项目-基本 ⭐⭐⭐⭐⭐

打包备份 /etc/,/var/spool/cron/目录备份到/backup/下面,压缩包bak-conf-2023-01-01-周几.tar.gz

完整的备份脚本:

  1. 正常打包备份,压缩包上加上时间,周几.

  2. 清理旧的备份(find+rm)

  3. 书写脚本.

  4. 涉及到脚本变量,反引号.

  5. 脚本变量,反引号.

  6. 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

posted @ 2024-09-11 21:49  老虎死了还有狼  阅读(58)  评论(0编辑  收藏  举报