• Linux 周期任务


    一次性任务

    在某个特定的时间,执行一次后被清除

    相关命令/进程

    • at 命令
    • atd进程

    在centos6中,系统服务的名称: /etc/init.d/atd

    查看系统上该进程时候启动:

    [root@ecs-t6-large-2-linux-20190824103606 ~]# ps -ef | grep atd
    root      4472     1  0 Sep04 ?        00:00:00 /usr/sbin/atd -f
    root      9628  9222  0 18:21 pts/0    00:00:00 grep --color=auto atd
    

    创建一次性任务

    格式:

    • at [HH:MM]
    • at [HH:MM] [yyyy-mm-dd]
    • at now + 数字 [minutes |hours | days | weeks]

    例: 创建定时任务, 在下一分钟,创建一个文件

    [root@ecs-t6-large-2-linux-20190824103606 init.d]# at 18:33
    at> touch 123
    at> <EOT>
    job 3 at Sat Sep 14 18:33:00 2019
    [root@ecs-t6-large-2-linux-20190824103606 init.d]# ll
    total 44
    -rw-r--r--  1 root root     0 Sep 14 18:33 123
    

    保存定时任务快捷键 ctrl + d

    将文件中的命令当作定时任务

    格式: at 时间 -f 文件

    例: 五分钟后执行 /root/test.sh

    at now + 5 minutes -f /root/test.sh
    

    查询当前系统上的一次性定时任务

    • 命令1:
    at -l
    [root@ecs-t6-large-2-linux-20190824103606 init.d]# at -l
    没任何结果说明没有一次性任务
    
    • 命令2:
    atq
    [root@ecs-t6-large-2-linux-20190824103606 init.d]# atq
    没任何结果说明没有一次性任务
    
    [root@ecs-t6-large-2-linux-20190824103606 init.d]# atq
    5	Sat Sep 14 20:00:00 2019 a root
    5  是任务号
    

    根据任务编号删除指定的一次性任务

    • 命令1
    atrm [编号]
    
    • 命令2
    at -d
    

    查看一次性任务的具体内容

    at -c [任务号]
    

    创建的一次性任务文件所在位置

    /var/spool/at/a*
    在这个路径下,全部a开头的文件都在这里面

    [root@ecs-t6-large-2-linux-20190824103606 init.d]# ll /var/spool/at/
    total 8
    -rwx------  1 root root 3085 Sep 14 18:37 a00005018ee170
    drwx------. 2 root root 4096 Sep 14 18:33 spool
    

    任务执行过之后,这个文件就会消失

    在那些文件中显示哪些用户是否可以使用定时任务

    • /etc/at.deny :这个名单中的用户不可以使用定时任务
    • /etc/at.allow: 这个名单中的用户可以使用

    周期性任务

    按照预订的计划重复执行任务

    相关命令/进程

    • crontab命令
    • crond进程

    在centos6中,周期任务对应的服务是: /etc/init.d/crond

    查看系统上该进程是否被启动

    [root@ecs-t6-large-2-linux-20190824103606 ~]# ps -ef | grep crond
    root      4474     1  0 Sep04 ?        00:00:00 /usr/sbin/crond -n
    root      9699  9222  0 18:23 pts/0    00:00:00 grep --color=auto crond
    

    创建的周期任务文件所在位置

    /var/spool/cron/用户名

    所以查看系统上是否存在周期任务可以如下:

    [root@ecs-t6-large-2-linux-20190824103606 init.d]# cat  /var/spool/cron/root 
    5 11 * * * /tmp/touch_file
    

    cron 服务的配置文件

    [root@ecs-t6-large-2-linux-20190824103606 init.d]# 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
    
    

    注意上面的PATH,这个PATH可能和系统中的PATH不同,这就意味着,当我们命令行敲某些命令时可以根据系统的PATH找到这些命令,但是如果周期任务的PATH中缺少一些路径,就可能导致周期运行命令时失败

    • 查看系统的PATH, (我的默认是完全相同的)
    [root@ecs-t6-large-2-linux-20190824103606 init.d]# echo $PATH
    /sbin:/bin:/usr/sbin:/usr/bin
    

    如果真的出现了不能执行的命令怎么办? 可以在命令前面加上绝对路径 /bin/ 命令

    例子: 创建一个脚本文件

    [root@ecs-t6-large-2-linux-20190824103606 tmp]# cat touch_file 
    touch a$RANDOM
    

    执行这个脚本

    [root@ecs-t6-large-2-linux-20190824103606 tmp]# bash touch_file 
    [root@ecs-t6-large-2-linux-20190824103606 tmp]# ll
    total 48
    -rw-r--r-- 1 root root     0 Sep 14 18:59 a21698
    

    给这个脚本添加x, 让其可执行

    [root@ecs-t6-large-2-linux-20190824103606 tmp]# chmod +x touch_file 
    [root@ecs-t6-large-2-linux-20190824103606 tmp]# ll
    -rwxr-xr-x 1 root root    15 Sep 14 18:59 touch_file
    

    再次执行:

    [root@ecs-t6-large-2-linux-20190824103606 tmp]# ./touch_file 
    [root@ecs-t6-large-2-linux-20190824103606 tmp]# ll
    total 48
    -rw-r--r-- 1 root root     0 Sep 14 18:59 a21698
    -rw-r--r-- 1 root root     0 Sep 14 19:01 a3460
    

    当我们切换到其他目录时, 只能通过添加绝对路径才能运行脚本

    [root@ecs-t6-large-2-linux-20190824103606 tmp]# bash /tmp/touch_file 
    

    添加到周期任务中

    查看cron服务的日志文件

    /var/log/cron

    从这个日志文件中可以看到历史任务执行记录

    管理cron计划任务

    • 编辑计划任务:crontab -e [-u 用户名]
    • 查看计划任务:crontab -l [-u 用户名]
    • 删除计划任务:crontab -r [-u 用户名]

    周期任务的格式

    [root@ecs-t6-large-2-linux-20190824103606 init.d]# 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
    
    
    *           *               *                   *                *
    分钟      小时            日期                月份            星期
    0-59      0-23             1-31              1-12            0-7
    
    0  17  *  *  1- 5   	周一到周五的每天17:00
    30  8  *  *  1,3,5       星期1,3,5 每天八点半
    0  8-18  *  *  *          每天的8-18点
    0  12     *  *  	        每隔三天的12点
    

    系统级别的计划任务及其扩展anacrontab

    适用于下面的两种情况

    linux 主机存在定时任务, 但主机又不是时时刻刻开机, 通过如下配置,可以实现, 一开机执行错过的定时任务

    我有一个脚本, 需要每天都运行一次,但是什么时候运行我们并不关心,但是得运行

    [root@ecs-t6-large-2-linux-20190824103606 ~]# cat /etc/anacrontab 
    # /etc/anacrontab: configuration file for anacron
    
    # See anacron(8) and anacrontab(5) for details.
    
    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    # the maximal random delay added to the base delay of the jobs
    RANDOM_DELAY=45
    
    # the jobs will be started during the following hours only
    # 每天的3点到22点 都可能会启动任务
    START_HOURS_RANGE=3-22
    
    #period in days   delay in minutes   job-identifier   command
    # 每隔多少天执行后面的命令  延迟时间    动作的表示    执行的命令
    1	5	cron.daily		nice run-parts /etc/cron.daily
    7	25	cron.weekly		nice run-parts /etc/cron.weekly
    @monthly 45	cron.monthly		nice run-parts /etc/cron.monthly
    
    

    这个延迟的解释是 , 假如我的八点开机的, 八点在 3-22点之间, 但是任务不会一开机立即执行, 会延迟[5分钟]执行
    延迟也可以是 0-45 随机时间

    run-parts 命令
    run-parts + 路径
    执行该目录下的脚本

  • 相关阅读:
    软件可靠性与安全性设计与实现知识梳理(软件可靠性与安全性高级技术研讨会心得)
    SSM框架整合
    不注册Tomcat服务,运行Tomcat不弹出JAVA控制台窗口
    ExtJS表单之复选框CheckboxGroup展示与取值
    ExtJS获取父子、兄弟容器元素方法
    LabVIEW之生产者/消费者模式--队列操作 彭会锋
    ExtJS Grid导出excel文件
    jeesite部署到Tomcat后,无法访问,cannot be resolved in either web.xml or the jar files deployed with this application
    滚动轮播插件——jCarouselLite
    统计学基础之假设检验
  • 原文地址:https://www.cnblogs.com/ZhuChangwu/p/11519940.html
Copyright © 2020-2023  润新知