• Linux定时任务--Crond使用教程


    Linux定时任务--Crond使用教程

    1. 介绍Crond

    crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

    Cron 是UNIX, SOLARIS,LINUX下的一个十分有用的工具。通过Cron脚本能使计划任务定期地在系统后台自动运行。这种计划任务在UNIX, SOLARIS, LINUX下术语为cron jobs。 Crontab (CRON 表)则是用来记录在特定时间运行的CRON的一个脚本文件。

    2. 控制Crond状态的命令

    crontab -l #查看任务
    crontab -e  #便捷定时编辑任务
    systemctl reload crond.service #重启crontab
    systemctl start crond.service 
    systemctl stop crond.service
    systemctl restart crond.service
    
    # 如果不支持systemctl命令
        service crond start    //启动服务
        service crond stop     //关闭服务
        service crond restart  //重启服务
        service crond reload   //重新载入配置
        service crond status   //查看服务状态 
    /sbin/service crond start //启动服务
    /sbin/service crond stop //关闭服务
    /sbin/service crond restart //重启服务
    /sbin/service crond reload //重新载入配置
    
    
    # 设置Crond开机是否自启
    # 1. 查看crond.serivce服务的自启动状态
    systemctl is-enabled crond/crond.service
    > disabled
    # 1.1 此时crond.serivce的自启动状态为disabled [开机不会自启动]
    # 1.2 如果时enabled,表示自启动状态为enabled  [开机会自启动]
    
    # 开启crond.serivce服务自启动
    systemctl enable crond/crond.service
    systemctl is-enabled crond/crond.service
    > enabled
    
    # 列出所有的启动文件:
    systemctl list-unit-files
    
    # 列出所有状态为enable的启动文件
    systemctl list-unit-files | grep enable
    
    # 关闭crond.serivce的自启动状态
    systemctl disable crond/crond.service
    

    3. 权限控制

    为了安全性,可以限制使用crontab的用户账号,使用的限制数据:
    /etc/cron.allow
    将可以使用的crontab的账号写入其中,若不在这个文件内的用户则不可使用crontab

    /etc/cron.deny
    将不可使用crontab的账号写入其中,若未记录到这个文件当中的用户,就可以使用crontab。

    以优先级来说,/etc/cron.allow/etc/cron.deny要优先,一般来说,建议只保留一个即可,系统默认是保留/etc/cron.deny

    当用户使用crontab这个命令新建工作调度之后,这项工作就会被记录到/var/spool/cron/里面,而且以该账号来判别的。
    举例:tom 使用crontab后,他的工作会被记录到/var/spool/cron/tom里面去。也就是说/var/spool/cron/tom 记录了,tom用户编辑的定时任务。

    cron执行的每一项工作都会被记录到/var/log/cron这个日志文档中;

    Java程序输出在Console中的日志也会打印到/var/log目录中的message文件中

    4. Crontab命令

    时间段分别代表的含义
    0 12 * * *
    分 时 日 月 周

    不能使用vi直接编辑该文件,因为可能由于输入语法错误,会导致无法执行cron。
    使用crontab -e 命令来编辑

    每项工作(每行)的格式都是具有六个字段,这六个字段的意义如下表:

    command 一般我们用的是可执行的shell文件

    比较有趣的是那个”周”,周的数字为0或7时,代表的是星期天的意思。
    下图介绍一下辅助的字符

    ![](https://img2020.cnblogs.com/blog/1129285/202007/1129285-20200711215807181-27280894.png

    例子

    5. 系统的配置文件:/etc/crontab

    crontab -e 命令是针对用户的cron设计的,如果是系统的例行性任务时,就需要系统的配置文件/etc/crontab
    其实 crontab -e 其实是/usr/bin/crontab这个文件,而etc/crontab 是系统的配置文件

    看这个文件内容 其实与刚才的crontab -e 的内容几乎一样,但是还有几个地方不一样

    1、MAILTO=root

    这个选项的意思是说,当 /etc/crontab 这个档案中的例行性命令发生错误时,会将错误讯息或者是屏幕显示的讯息传给谁?由于 root 并无法再用户端收信,因此,我通常都将这个 e-mail 改成自己的账号,好让我随时了解系统的状态!

    2、PATH=….
    这里就是输入执行文件的查找路径,使用默认的路径设置就已经很足够了。

    3、01 * * * * root run-parts /etc/cron.hourly:

    在 #run-parts 这一行以后的命令,我们可以发现,五个数字后面接的是 root ,这一行代表的是『执行的级别为root身份』当然,你也可以将这一行改为成其他的身份!而 run-parts代表后面接的 /etc/cron.hourly 是『一个目录内(/etc/cron.hourly)的所有可执行文件』,也就是说,每个小时的01分,系统会以root身份去/etc/cron.hourly这个目录下执行所有可执行的文件!后面三行也是类似的意思!你可以到 /etc/ 底下去看看,系统本来就预设了这4个目录!你可以将每天需要执行的命令直接写到/etc/cron.daily即可,还不需要使用到crontab -e的程式!

    举例:


    注意:周与日、月不可同时并存

    6. 定时任务脚本输出内容重定向

    如果crontab不重定向输出,并且crontab所执行的命令有输出内容的话,是一件非常危险的事情。因为该输出内容会以邮件的形式发送给用户,内容存储在邮件文件

    /var/spool/mail/$user

    如果命令执行比较频繁(如每分钟一次),或者命令输出内容较多,会使这个邮件文件不断追加内容,文件越来越大。而邮件文件一般存放在根分区,根分区一般相对较小,所以会造成根分区写满而无法登录服务器。

    所以在添加crontab命令时,无论命令是否有输出,最好都加上输出重定向到文件或者/dev/null中。如下

    */5 * * * * /root/XXXX.sh &>/dev/null 2>&1
    `感觉上面的语句应该改有问题,应该使用下面的语句`
    */5 * * * * /root/XXXX.sh 1>/dev/null 2>&1
    
    输出内容写入文件的两种方式:
    追加: echo " " >> 文件名
    
    覆盖: echo " " > 文件名
    

    /dev/null 代表空设备文件

    > 代表重定向到哪里,例如:echo "123" > /home/123.txt
    1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
    2 表示stderr标准错误
    & 表示等同于的意思,2>&1,表示2的输出重定向等同于1

    那么>/dev/null 2>&1的意思就是:
    标准输出重定向到空设备文件,也就是不输出任何信息到终端,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

    我们也可以将我们通过定时任务执行的脚本的输出内容,输出到文件

    # 定时任务配置
    */1 * * * *  /var/spool/cron/bash/test.sh >> /var/spool/cron/bash/test.log
    
    # test.sh 文件内容
    #!/bin/bash
    echo "hello crond"
    
    # test.log
    hello crond
    hello crond
    hello crond
    hello crond
    hello crond
    hello crond
    ......
    

    7. 常用列子

    30 21 * * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每晚的21:30重启apache。
    45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每月1、10、22日的4 : 45重启apache。
    10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每周六、周日的1 : 10重启apache。
    0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
    0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每星期六的11 : 00 pm重启apache。
    * */1 * * * /usr/local/etc/rc.d/lighttpd restart
    每一小时重启apache
    * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
    晚上11点到早上7点之间,每隔一小时重启apache
    0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
    每月的4号与每周一到周三的11点重启apache
    0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
    一月一号的4点重启apache
    

    参考链接

  • 相关阅读:
    6. ModelDriven拦截器、Preparable 拦截器
    5. 标签和主题
    前后端开发联调遇到的问题以及排查
    手写HashTable
    Java项目常用注解总结
    快速排序就这么简单
    交替打印出奇数和偶数
    Java的SpringMVC执行流程
    Java中Comparable与Comparator的区别
    阻塞非阻塞,同步和异步的概念
  • 原文地址:https://www.cnblogs.com/dream-it-possible/p/13285738.html
Copyright © 2020-2023  润新知