cron定时任务

cron定时任务

前言

什么是定时任务:后台运行,到了一定的时间就会自动执行的任务,前提是:事先手动将计划任务设定好。

  • 周期性任务执行
  • 清空/tmp目录下的内容
  • mysql数据库备份
  • redis数据备份
  • 如果是按秒执行则 用sleep 例如while true; echo "1" >> test.txt; sleep 10; done
  1. 检查crond服务相关的软件包

    [root@localhost ~]# rpm -qa cron*
    crontabs-1.11-6.20121102git.el7.noarch
    cronie-anacron-1.4.11-23.el7.x86_64
    cronie-1.4.11-23.el7.x86_64
    
    rpm -ivh安装rpm软件
    rpm -qa 查看软件是否安装
    rpm -ql查看软件详细信息
    rpm -qf查看命令属于的安装包
    rpm -e卸载软件
    
  2. 检查crond服务是否运行

    systemctl status crond
    

crond定时任务服务应用

Cron是Linux系统中以后台进程模式周期性执行命令或指定程序任务的服务软件名。
Linux系统启动后,cron软件便会启动,对应的进程名字叫做crond,默认是定期(每分钟检查一次)检查系统中是否有需要执行的任务计划,如果有,则按计划进行,好比我们平时用的闹钟。

  • crond定时任务默认最快的频率是每分钟执行
  • 若是需要以秒为单位的计划任务,则编写shell脚本更格式, crond不适用了
[root@localhost ~]# cat /tmp/cron_test.sh 
#!/bin/bash
while true
do
echo 'shell_cron_test'
sleep 1
done

linux下定时任务

  • at定时任务工具,依赖于atd服务,适用于执行一次就结束的调度任务

例如突发任务,某天夜里3点需要临时性备份数据,可以用at软件

语法
HH:MM
YYYY-mm-dd
noon 	 正午中午12点
midnight 正午中午12点
midnight 下午茶时间,下午四点
tomorrow 明天
now+1min 一分钟之后
now+1minutes/hours/days/weeks

[root@localhost ~]# at now+1min
at> touch at_test.txt
at> <EOT>
job 2 at Sun Jul  2 23:04:00 2023
您在 /var/spool/mail/root 中有新邮件
[root@localhost ~]# ls
anaconda-ks.cfg  at_test.txt  initial-setup-ks.cfg  公共  模板  视频  图片  文档  下载  音乐  桌面
  • mailx命令
[root@localhost ~]# mailx -s "hello xiaosang" xiaosang 
hellow xiaosang!
.	输入.退出编辑
EOT

su - xiaosang 切换至xiaosang用户
输入mail查看邮件
每封邮件前有序号输入序号直接查看该邮件
  • mail命令
[root@localhost ~]# vim /tmp/hello_biaosang.txt
[root@localhost ~]# cat /tmp/hello_biaosang.txt 
hello biaosang!!!
[root@localhost ~]# mail -s "hello biaosang" biaosang < /tmp/hello_biaosang.txt 
切换至biaosang用户
输入mail查看邮件
...

实践cron定时任务

向crond进程提交任务的方式与at不同,crond需要读取配置文件,且有固定的文件格式,通过crontab命令管理文件

cron任务分为两类

  • 系统定时任务

crond服务除了会在工作时查看/var/spool/cron文件夹下的定时任务文件以外,还会查
看/etc/cron.d目录以及/etc/anacrontab 下面的文件内容,里面存放每天、每周、每月需要执行的系统任务

[root@localhost /]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed 
user-name 是以某一个用户身份运行任务
command to be executed 任务是什么
  • 用户定时任务计划

当系统管理员(root)或是普通用户(chaoge)创建了需要定期执行的任务,可以使用crontab命令配置,crond服务在启动时,会每分钟查看/var/spool/cron路径下以系统用户名命名的定时任务文件,以确定是否有需要执行的任务。

`root用户有一个定时任务文件`
[root@localhost /]# ls -l /var/spool/cron/
总用量 4
-rw------- 1 root root 71 6月   5 15:46 root

`查看此root定时任务的内容`
[root@localhost /]# cat /var/spool/cron/root
* * * * * /usr/bin/echo 'Hello,this is crontab' >> /tmp/my_crontab.txt

`等同于如下命令`
[root@localhost /]# crontab -l
* * * * * /usr/bin/echo 'Hello,this is crontab' >> /tmp/my_crontab.txt

crontab

crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似

选项 功能
-u user 用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。
-e 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
-l 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。
-r 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。
-i 在删除用户的 crontab 文件时,给确认提示。

crontab命令就是在修改/var/spool/cron中的定时任务文件用户查看定时任务

crontab 后面文件地址要写绝对地址

定时任务语法格式

案例

*  *  *  *  *	 
分 时 日 月 周

每天上午8点30,去上学
30 08 * * * go to school

每天晚上12点回家睡觉
00 00 * * * go home 
特殊符号 含义
*(星号) 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。
,(逗号) 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。
-(中杠) 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。
/(正斜线) 代表每隔多久执行一次。比如"/10***命令",代表每隔 10 分钟就执行一次命令。

举例:

时间 含义
45 22 *** 在 22 点 45 分执行命令
0 17 ** 1 在每周一的 17 点 0 分执行命令
0 5 1,15** 在每月 1 日和 15 日的凌晨 5 点 0 分执行命令
40 4 ** 1-5 在每周一到周五的凌晨 4 点 40 分执行命令
*/10 4 *** 在每天的凌晨 4 点,每隔 10 分钟执行一次命令
0 0 1,15 * 1 在每月 1 日和 15 日,每周一个 0 点 0 分都会执行命令,注意:星期几和几日最好不要同时出现,因为它们定义的都是天,非常容易让管理员混淆
*/10 * * * * 每隔10分钟执行一次任务
* 9-18 * * 1-5 周一到周五的每天早上9点一直到下午6点的每一个整点(工作日的每个小时整点)

crontab练习题

每天的凌晨3点半,和12点半执行脚本
30 3,12 * * *

每隔6小时,相当于6、12、18、24点的半点时刻,执行脚本
30 */6 * * *

每天晚上9点30重启nginx
30 21 * * * /usr/bin/systemctl restart nginx

每月的1、10号凌晨4点45执行脚本
45 4 1,10 1 * 

每周六、周日的凌晨1点10分执行命令
10 1 * * 6,0

每天早上7点到上午11点,每2小时执行命令
0 7-11/2 * * * 
posted @ 2023-07-03 01:29  FouroFour  阅读(140)  评论(0编辑  收藏  举报