zoukankan      html  css  js  c++  java
  • 【Linux命令】at、crontab(cronb)定时任务

    crontab定时任务(周期性)

    一、简介

    通过crontab命令可以在固定的间隔执行系统指令或shell脚本

    二、crontab配置文件:

    Linux下的任务调度分为两类:系统任务调度和用户任务调度。

    Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。用户自己设置的计划任务则使用crontab 命令。

    查看crontab配置文件:

    [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

    分析:

      第一行指定系统使用的shell环境

      第二行指定系统执行命令的路径

      第三行指定crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户

    注意:所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致

    三、crontab文件含义

    用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段

    格式如下:minute hour day month week command

    minute:代表一小时内的第几分,范围 0-59。
    hour:代表一天中的第几小时,范围 0-23。
    mday:代表一个月中的第几天,范围 1-31。
    month:代表一年中第几个月,范围 1-12。
    week:代表星期几,范围 0-7 (0及7都是星期天)。
    who:要使用什么身份执行该指令,当您使用 crontab -e 时,不必加此字段。
    command:所要执行的指令。

    "*"代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月;

    "/"代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。

    "-"代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”,小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。

    ","分散的数字(不一定连续),如1,2,3,4,7,9。

     四、crontab命令详解

    格式:crontab [-u user] file

    crontab [ -u user ] [ -i ] { -e | -l | -r }

    • • -u user:用于设定某个用户的crontab服务;
    • • file: file为命令文件名,表示将file作为crontab的任务列表文件并载入crontab;
    • • -e:编辑某个用户的crontab文件内容,如不指定用户则表示当前用户;
    • • -l:显示某个用户的crontab文件内容,如不指定用户则表示当前用户;
    • • -r:从/var/spool/cron目录中删除某个用户的crontab文件。
    • • -i:在删除用户的crontab文件时给确认提示。

    五、crontab实例

    1)每一分钟执行一次command(因cron默认每1分钟扫描一次,因此全为*即可)

    * * * * * command

    2)每小时的第3和第15分钟执行command

    3,15 * * * * command

    3)每天上午8-11点的第3和15分钟执行command:

    3,15 8-11 * * * command

    4)每隔2天的上午8-11点的第3和15分钟执行command:

    3,15 8-11 */2 * * command
    0 0 */2 * * command //每隔两天凌晨执行command

    5)每个星期一的上午8点到11点的第3和第15分钟执行command

    3,15 8-11 * * 1 command

    6)每晚的21:30重启smb

    30 21 * * * /etc/init.d/smb restart

    7)每月1、10、22日的4 : 45重启smb

    45 4 1,10,22 * * /etc/init.d/smb restart

    8)每周六、周日的1 : 10重启smb

    10 1 * * 6,0 /etc/init.d/smb restart

    9)每天18 : 00至23 : 00之间每隔30分钟重启smb

    0,30 18-23 * * * /etc/init.d/smb restart

    10)每一小时重启smb

    * */1 * * * /etc/init.d/smb restart

    11)晚上11点到早上7点之间,每隔一小时重启smb

    * 23-7/1 * * * /etc/init.d/smb restart

    12)每月的4号与每周一到周三的11点重启smb

    0 11 4 * mon-wed /etc/init.d/smb restart

    13)每小时执行/etc/cron.hourly目录内的脚本

    0 1 * * * root run-parts /etc/cron.hourly

    at定时任务(一次性的)

      at只在固定时间执行一次任务。

    格式:

    # 在命令行输入at,然后指定执行的时间,在输入enter键换行,接下来输入要执行的任务,多任务继续输入enter键换行隔开。输入的任务完毕,此时按下ctrl+d,则会出现“at-> ”,此时输入完毕。屏幕底下会出现类似“job 3 at 2019-11-25 09:17”的字样,证明任务指定成功。
    
    at #执行的时间#
    at->#执行的任务脚本#
    at->#执行的任务脚本#
    at->

    PS:如果设置的时间当天已经过了,则会在第二天的固定时间执行

    参数:

    -m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
    -v 显示任务将被执行的时间
    -c 打印任务的内容到标准输出
    -V显示版本信息
    -q<> 使用指定的队列
    -t<> 以时间参数的形式提交要运行的任务
    
    # 查看at的进程
    [root@VM_0_10_centos ~]# ps -ef | grep atd
    [root@VM_0_10_centos ~]# systemctl status atd
    
    # 查看任务
    [root@VM_0_10_centos ~]# atq
    或
    [root@VM_0_10_centos ~]# at -l

    # 查看任务内容
    [root@VM_0_10_centos ~]# at -c 2
    #删除(这里的2是任务的序号,可以使用at -l查看) [root@VM_0_10_centos ~]# atrm 2

    实例:

    # 指定在今天09:00将时间写入testmail.txt文件中
    [root@VM_0_10_centos ~]# at 09:00
    at> date >> testmail.txt<EOT>            
    job 1 at Mon Nov 25 09:00:00 2019
    
    # 例如当前时间为08:50,如果输入一个08:00执行的任务,则会在输入命令后,提示第二天执行:
    [root@VM_0_10_centos ~]# at 08:00
    at> echo "8:00" >> testmail.txt
    at> <EOT>
    job 2 at Tue Nov 26 08:00:00 2019
    
    # 使用相对时间,1分钟后执行
    [root@VM_0_10_centos ~]# at now+1 minutes
    at> echo hello > testmail.txt
    at> <EOT>
    job 3 at Mon Nov 25 09:16:00 2019
    
    # 使用未来时间的绝对时间
    [root@VM_0_10_centos ~]# at 09:18 2019-11-25
    at> echo world >> testmail.txt
    at> <EOT>
    job 4 at Mon Nov 25 09:18:00 2019

    # 三天后的下午5点执行/bin/ls
    # at 5pm+3 days
    # at> /bin/ls

    PS:如果不希望某些账号使用at命令,可以在/etc/at.deny文件中写入禁止的
    用户名。

     

     

  • 相关阅读:
    在vue项目中使用element-ui的Upload上传组件
    express使用ejs模板引擎渲染html文件
    nodejs服务端实现post请求
    anroid学习笔记(1)
    水平遍历和嵌套递归
    写代码的风格
    简易版本vue的实现和注解
    JavaScript下的new操作符做了什么?
    node下的跨域传递cookie
    用node研究axios前后端交互状态码规则
  • 原文地址:https://www.cnblogs.com/HeiDi-BoKe/p/11614278.html
Copyright © 2011-2022 走看看