Linux中滴计划任务

Posted fiveym

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中滴计划任务相关的知识,希望对你有一定的参考价值。

计划任务

计划任务

计划任务(Cron Job)是指在预定的时间自动执行一些指定的任务或脚本。在Linux和Unix系统中,计划任务由Cron(Cron daemon)服务来实现。Cron服务可以在规定的时间执行一些命令或程序,比如定时备份数据库、定时清理垃圾文件、定时发送邮件等。

daemon:守护进程,一直在内存里运行的进程,知道我们人为停止他的运行,不然他是一直在内存中运行的,因为一直在内存中运行,所以我们的用户可以随时去访问。

计划任务分类

使用at命令调用atd进程设置在某个特定的时间,执行一次任务

使用crontab命令调用crond进程,设置按固定的周期(如每天,每周等)重复执行预先计划好的任务

at命令

在特定的日期、时间点自动执行预选设置的一些命令操作,属于一次性计划任务

系统服务的名称: /etc/init.d/atd

设置格式:at [HH:MM] [yyyy-mm-dd]

[root@kafka3 lianxi]# service atd start   启动atd服务,不然不会定时去执行任务
Redirecting to /bin/systemctl start atd.service
您在 /var/spool/mail/root 中有新邮件
[root@kafka3 lianxi]# at 23:00  创建一个一次性执行的计划任务
at> bash /root/6.sh
at> <EOT>
job 6 at Sun Mar 26 23:00:00 2023
[root@kafka3 lianxi]# at -l    查看计划任务的列表
3	Sun Mar 26 20:29:00 2023 a root
6	Sun Mar 26 23:00:00 2023 a root
[root@kafka3 lianxi]# atrm 3   删除计划任务编号为3的任务
[root@kafka3 lianxi]# at -l
6	Sun Mar 26 23:00:00 2023 a root

存放一次性计划任务的目录
[root@kafka3 ~]# cd /var/spool/at
[root@kafka3 at]# ls
a0000601ab34c4  spool
[root@kafka3 at]# cd ..
[root@kafka3 spool]# ls
anacron  at  cron  lpd  mail  plymouth  postfix
[root@kafka3 spool]# pwd
/var/spool

load average

[root@kafka3 ~]# uptime
 15:49:45 up 4 min,  2 users,  load average: 0.00, 0.04, 0.03
 三个数值分别为 1分钟、5分钟、15分钟前到现在的可运行或者不可中断的进程的平均值。
 可以理解为就绪队列里的进程的数量

CPU的就绪队列里的进程的数量

电脑只有一个核心,就绪队列里有一个进程在排队,就算法CPU已经满负荷运转了,如果超过1就更加忙了

电脑有八个核心,就绪队列里有8个进程在排队,就算法CPU已经满负荷运转,如果超过8更加忙了

crontab命令

  • 按照预先 设置的时 间舟曲(分钟,小时,天…),重复执行用户指定的命令操作,属于周期性计划任务
  • 服务名称: /etc/init.d/crond
  • 主要设置文件
    • 用户定义的设置,位于文件:/var/spool/cron/用户名
[root@kafka3 ~]# cd /var/spool/
[root@kafka3 spool]# ls
anacron  at  cron  lpd  mail  plymouth  postfix
[root@kafka3 spool]# cd cron
[root@kafka3 cron]# ls
[root@kafka3 cron]#  pwd
/var/spool/cron    存放crontab创建的周期性计划任务的
[root@kafka3 cron]# 
[root@kafka3 cron]#  ps aux|grep crond  服务是默认安装的,而且开机自动启动
root        734  0.0  0.0 126384  1620 ?        Ss   15:45   0:00 /usr/sbin/crond -n
root       1868  0.0  0.0 112824   988 pts/0    S+   16:51   0:00 grep --color=auto crond


配置文件通常包含三个部分

注释

环境变量

cron命令

[root@kafka3 cron]#  crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@kafka3 cron]# crontab -l
30 3 * * * /root/sc.sh
[root@kafka3 cron]# 
[root@kafka3 cron]# useradd wwjz
[root@kafka3 cron]# su - wwjz
[wwjz@kafka3 ~]$ crontab -e
no crontab for wwjz - using an empty one
crontab: installing new crontab
[wwjz@kafka3 ~]$ crontab -l
40 4 * * * bash ~/sc.sh
[wwjz@kafka3 ~]$ cd /var/spool/cron/
-bash: cd: /var/spool/cron/: 权限不够
[wwjz@kafka3 ~]$ exit
登出
[root@kafka3 cron]# ls
root  wwjz

crontab是创建管理周期性计划任务的命令,最小的时间间隔是1分钟

-e表示创建一个计划任务 edit

-l表示查看计划任务列表

cron服务配置文件

位于文件:/etc/crontab

cron服务的日志文件

位于文件:/var/log/cron

可以知道一个计划任务是否执行

记录创建,查看,执行等相关的操作

[root@kafka3 log]#  crontab -e
crontab: installing new crontab
[root@kafka3 log]# crontab -l
30 3 * * * bash /root/sc.sh
*/1 * * * * bash /root/wang.sh
[root@kafka3 log]# cat cron
Mar 27 17:15:00 kafka3 crontab[1935]: (root) LIST (root)
Mar 27 17:15:01 kafka3 crond[734]: (root) RELOAD (/var/spool/cron/root)
Mar 27 17:15:01 kafka3 CROND[1937]: (root) CMD (bash /root/wang.sh)
您在 /var/spool/mail/root 中有新邮件
[root@kafka3 log]# 
[root@kafka3 log]# yum install ntpdate -y
censtos7里可以使用ntpdate命令同步时间(和互联网的时间服务器同步时间)
centos8里 chrony服务
[root@kafka3 log]#ntpdate time.windows.com
27 Mar 17:56:40 ntpdate[2212]: adjust time server 20.189.79.72 offset -0.003294 sec

时间数值的特殊表示方法

  • (星号)表示该范围内的任意时间

, 表示间隔的多个不连续时间点

_ 表示一个连续的时间范围

/n 指定间隔的时间频率

应用实例

  • 0 17 * * 1-5
  • 30 8 * * 1,3,5
  • 0 8-18 * * *
  • 0 12 */3 * *

案例

1,编写一个/backup/backup_log.sh脚本实现备份/var/log目录下所有的文件到/backup目录下,要求文件名是包含当天日期,精确到秒,文件名例名例如:2022-3-3-3_40_20_log.tar.gz同时要求删除/backup目录下七天的备份文件,只保留最近7天的,

1,以root用户的身份去执行,计划任务的要求是每天的4:30执行上面的这个脚本/backup/backup_log.sh

[root@kafka3 backup]# pwd
/root/backup
您在 /var/spool/mail/root 中有新邮件
[root@kafka3 backup]# cat backup_log.sh 
#!/bin/bash
mkdir -p /backup
tar -czf /backup/$(date +%F_%H_%M_%S)-log.tar.gz  /var/log
find /backup -mtime +7 -type f -name "*.tar.gz" -exec rm -rf  \\;
[root@kafka3 backup]# crontab -e
crontab: installing new crontab
您在 /var/spool/mail/root 中有新邮件
[root@kafka3 backup]# crontab -l
30 4 * * * bash /root/backup/backup_log.sh
[root@kafka3 log]# pwd
/var/log
[root@kafka3 log]# cat cron
.........
Mar 27 04:30:01 kafka3 CROND[2598]: (root) CMD (bash /root/backup/backup_log.sh)
[root@kafka3 log]#  
 

ps:周和日,月不可同时并存,容易导致时间混乱

anacron服务

  • 弥补cron在系统关机后不能执行计划任务的问题
  • 不能替代cron
  • 按天、周或月为单位去检查系统未进行的cron任务
  • /var/spool/anacron
  • 服务名称:/etc/init.d/anacrond

Linux--计划任务!

linux中计划任务概述

设置某个时间来执行一些列命令实现任务,或者设置周期性的执行任务,例如提醒生日时间到了

linux计划任务种类

一、一次性的计划任务

由at命令设置一次性计划任务,注意要实现at命令必须要有atd这个服务才行,atd(这里的d表示守护进程,表示一直在后台运行的进程),事实上,我们用at这个命令产生要实现的任务,这个任务会加载进/var/spool/at目录下,然后等待atd这个服务的使用和执行
如果在at编写中的命令出现错误,at会默认发邮件给执行者,可在/var/spool/mail中查看

at 1018 2021-08-05 :输入此命令会进入一个计划表中,我们将我们想要执行的任务写入该
                       执行表并按Ctrl+d,系统就会在2021-08-05 1018这个时间段来执行这个计划任务
atq :查询已创建的一次性计划任务
at now +3min :两分钟后执行任务,后面的时间单位可以更换
atrm 任务号 :删除任务                   
[root@AIDEBOY ~]# at now +5min
at> touch whd
at> mv /root/whd /home<EOT>
job 7 at Thu May 13 14:59:00 2021
[root@AIDEBOY ~]# atq
7	Thu May 13 14:59:00 2021 a root         
[root@AIDEBOY ~]# atrm 7
[root@AIDEBOY ~]# atq
[root@AIDEBOY ~]# 

二、循环执行的计划任务

linux中用crontab这个命令来实现建立循环型计划任务,crontab命令建立任务后会记录在/var/spool/cron中

crontab -u :只有root才能执行这个任务,表示帮其他用户设置计划任务
crontab -l :查看crontab的任务内容
crontab -r :删除crontab内的所有计划任务内容
crontab -e :进入vim编辑界面,编辑计划任务
格式为:        分钟    小时   日期     月     周      命令串
时间的取值范围: 0-59   0-23   1-31   1-12    0-7
【周】中的0和7都表示星期天
时间的特殊符号:*表示该范围内的任意时间
              ,逗号表示表示多个时间点,比如【周】中1,3,5表示每周一、周三和周五
              -表示连续的时间点,如【日期】中15-19,表示每15到19号
              /表示指定时间间隔的频率,如【日期】中*/3,表示每三天,10-25/2表示10号到25号每三天执行一次
注意:后面的命令串中的命令最好用路径的方式表示

例子:编辑完跟vim编辑器一样wq退出即可

[root@AIDEBOY ~]# crontab -e
0 5-11 * * * /bin/rm -rf /var/www/html/*
#上午5点到晚上11点之间,每隔一小时清理/var/www/htmI目录-次
~                                                                                                                                                                                                                                                                                                                                                                                                              
#假如你女友Luxi的生日是5月22,你想5月21日23:59给她发一封信,信在/home/lover.txt
59 23 21 5 * mail Luxi < /home/lover.txt                                                                                                                             
~                                                                                                                                     
#每月每天凌晨3点30分和中午12点30分执行/tmp下的hello.sh脚本                                                                                                                                    
30 3 * * * /bin/sh /tmp/hello.sh
30 12 * * * /bin/sh /tmp/hello.sh                                                                                                                                     
~                                                                                                                                     
#每月每天早.上8点到下午18点每隔2小时的每30分钟查看系统时间                                                                                                                                    
30 8-18/2 * * /bin/date                                                                                                                                  
~                                                                                                                                     
                                                                                                                                  
-- INSERT --

注意:格式中没有几月几日且为星期几,例如本来想8月11号刚好是星期五执行任务

* * 11 8 5 命令串 :这里表示的可能为每8月内的每个星期5,而不是想要的8月11的星期5,与想要的规划不符

crontab的配置文件/etc/crontab,/etc/cron.d/

[root@AIDEBOY ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin        //执行文件的查找路径
MAILTO=root                               //执行任务发生错误时会发送邮件给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

黑白名单

为了安全性的问题,可以设置限制at和crontab使用的账户

  • 白名单:/etc/cron.allow和/etc/at.allow,默认两个文件是没有的,需要创建
    将可以使用at或crontab的账号写入其中,不在这文件内的用户则不可以使用at或crontab
  • 黑名单:/etc/cron.deny和/etc/at.deny
    记录在这文件内的账户则不可以使用at或crontab
    当两名单同时存在时,比较优先级白名单比黑名单优先,两种只会存在一种名单限制

以上是关于Linux中滴计划任务的主要内容,如果未能解决你的问题,请参考以下文章

Linux计划任务

linux如何创建计划任务

Linux基础学习-crond系统计划任务

linux计划任务失败如何排查原因

Linux系统的任务计划

Crontab 计划任务