zoukankan      html  css  js  c++  java
  • Linux中的定时自动执行功能(at,crontab)

    Linux中的定时自动执行功能(at,crontab)

    概念

    在Linux系统中,提供了两种提前对工作进行安排的方式

    • at 只执行一次

    • crontab 周期性重复执行

    通过对这两个工具的应用可以让我们在操作系统层面实现定时自动运行功能

    实验环境

    操作系统:CentOS Linux release 7.3.1611 (Core)
    
    IP: 192.168.230.134

    at介绍

    at命令会,并且会执行一次

    此功能会使用到atd工具,需要保证其为启动状态

    [root@localhost ~]# systemctl status atd
    ● atd.service - Job spooling tools
       Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
       Active: active (running) since Thu 2017-09-07 18:18:18 CST; 4h 2min ago
     Main PID: 921 (atd)
       CGroup: /system.slice/atd.service
               └─921 /usr/sbin/atd -f
    
    Sep 07 18:18:18 localhost.localdomain systemd[1]: Started Job spooling tools.
    Sep 07 18:18:18 localhost.localdomain systemd[1]: Starting Job spooling tools...

    at使用

    常用命令如下

    [root@localhost ~]# at -help
    Usage: at [-V] [-q x] [-f file] [-mMlbv] timespec ...
           at [-V] [-q x] [-f file] [-mMlbv] -t time
           at -c job ...
           atq [-V] [-q x]
           at [ -rd ] job ...
           atrm [-V] job ...
           batch

    时间格式:

    格式示例意义
    HH:MM 01:01 下一次1点1分执行
    HH:MM YYYY-MM-DD 01:00 2017-09-08 指定具体年月时间执行
    HH:MM[am/pm]+number[minutes/hours/days/weeks] now+3 days 某时间点再加些时间后

    at实例

    创建测试用sh,并修改权限

    [root@localhost ~]# vim test.sh
    
    echo '豆姐威武'
    
    [root@localhost ~]# chmod 755 test.sh 
    [root@localhost ~]# ./test.sh 
    豆姐威武

    查看当前时间

    [root@localhost ~]# date
    Thu Sep  7 23:19:51 CST 2017

    使用at命令,设定23:21执行test.sh命令,注意以Ctrl+d结束

    [root@localhost ~]# at 23:21
    at> /root/test.sh
    at> <EOT>
    job 5 at Thu Sep  7 23:21:00 2017

    坐等一分钟后,收到系统给的信息,查看时间以及到了设定时间

    You have new mail in /var/spool/mail/root
    [root@localhost ~]# date
    Thu Sep  7 23:21:04 CST 2017

    查看系统收到的信息

    [root@localhost ~]# cat /var/spool/mail/root
    
    From root@localhost.localdomain  Thu Sep  7 23:21:00 2017
    Return-Path: <root@localhost.localdomain>
    X-Original-To: root
    Delivered-To: root@localhost.localdomain
    Received: by localhost.localdomain (Postfix, from userid 0)
        id A139B243D2; Thu,  7 Sep 2017 23:21:00 +0800 (CST)
    Subject: Output from your job        5
    To: root@localhost.localdomain
    Message-Id: <20170907152100.A139B243D2@localhost.localdomain>
    Date: Thu,  7 Sep 2017 23:21:00 +0800 (CST)
    From: root@localhost.localdomain (root)
    
    豆姐威武

    抄一个比较实用的脚本: 
    定时关机

    [root@localhost ~]# at 18:00 2017-09-10
    at> /bin/sync
    at> /bin/sync
    at> /sbin/shutdown -h now
    at> <EOT>
    job 6 at Sun Sep 10 18:00:00 2017

    将在2017/09/07 18:00自动关机

    at命令的取消

    查看当前at命令 
    使用atq命令

    [root@localhost ~]# atq
    6   Sun Sep 10 18:00:00 2017 a root

    取消命令 
    使用atrm命令

    [root@localhost ~]# atrm 6

    crontab介绍

    crontab命令会按照配置周期性的执行

    他的记录会保存在/var/log/cron中

    此功能需要用到crond服务,需要保证其状态正常

    [root@localhost ~]# systemctl status crond
    ● crond.service - Command Scheduler
       Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
       Active: active (running) since Thu 2017-09-07 18:18:18 CST; 5h 51min ago
     Main PID: 920 (crond)
       CGroup: /system.slice/crond.service
               └─920 /usr/sbin/crond -n
    
    Sep 07 18:18:18 localhost.localdomain systemd[1]: Started Command Scheduler.
    Sep 07 18:18:18 localhost.localdomain systemd[1]: Starting Command Scheduler...
    Sep 07 18:18:18 localhost.localdomain crond[920]: (CRON) INFO (RANDOM_DELAY will be ...)
    Sep 07 18:18:19 localhost.localdomain crond[920]: (CRON) INFO (running with inotify ...)
    Hint: Some lines were ellipsized, use -l to show in full.
    

    crontab使用

    常用命令如下:

    [root@localhost ~]# crontab -help
    crontab: invalid option -- 'h'
    crontab: usage error: unrecognized option
    Usage:
     crontab [options] file
     crontab [options]
     crontab -n [hostname]
    
    Options:
     -u <user>  define user
     -e         edit user's crontab
     -l         list user's crontab
     -r         delete user's crontab
     -i         prompt before deleting
     -n <host>  set host in cluster to run users' crontabs
     -c         get host in cluster to run users' crontabs
     -s         selinux context
     -x <mask>  enable debugging

    时间格式:

    *    *    *    *    *
    -    -    -    -    -
    |    |    |    |    |
    |    |    |    |    |
    |    |    |    |    +----- day of week (0 - 7) (Sunday=0 or 7)
    |    |    |    +---------- month (1 - 12)
    |    |    +--------------- day of month (1 - 31)
    |    +-------------------- hour (0 - 23)
    +------------------------- min (0 - 59)

    crontab实例

    还是使用之前创建的test.sh做实验

    使用crontab命令新建计划

    先查看当前时间

    [root@localhost ~]# date
    Thu Sep  7 23:52:12 CST 2017

    创建计划,设定每天23:55执行 /root/test.sh脚本

    [root@localhost ~]# crontab -e
    
    55 23 * * * /root/test.sh
    
    no crontab for root - using an empty one
    crontab: installing new crontab

    查看当前计划:

    [root@localhost ~]# crontab -l
    55 23 * * * /root/test.sh

    坐等两分钟后:

    [root@localhost ~]# date
    Thu Sep  7 23:55:07 CST 2017
    You have new mail in /var/spool/mail/root

    查看记录:

    [root@localhost ~]# cat /var/spool/mail/root 
    From root@localhost.localdomain  Thu Sep  7 23:55:01 2017
    Return-Path: <root@localhost.localdomain>
    X-Original-To: root
    Delivered-To: root@localhost.localdomain
    Received: by localhost.localdomain (Postfix, from userid 0)
        id 45D1028EB7; Thu,  7 Sep 2017 23:55:01 +0800 (CST)
    From: "(Cron Daemon)" <root@localhost.localdomain>
    To: root@localhost.localdomain
    Subject: Cron <root@localhost> /root/test.sh
    Content-Type: text/plain; charset=UTF-8
    Auto-Submitted: auto-generated
    Precedence: bulk
    X-Cron-Env: <XDG_SESSION_ID=52>
    X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0>
    X-Cron-Env: <LANG=en_US.UTF-8>
    X-Cron-Env: <SHELL=/bin/sh>
    X-Cron-Env: <HOME=/root>
    X-Cron-Env: <PATH=/usr/bin:/bin>
    X-Cron-Env: <LOGNAME=root>
    X-Cron-Env: <USER=root>
    Message-Id: <20170907155501.45D1028EB7@localhost.localdomain>
    Date: Thu,  7 Sep 2017 23:55:01 +0800 (CST)
    
    豆姐威武

    crontab计划的删除

    如果需要删除一两个计划,直接使用crontab -e进入编辑页面删除 
    如果要清空计划,-r即可

    [root@localhost ~]# crontab -l
    55 23 * * * /root/test.sh
    [root@localhost ~]# crontab -r
    [root@localhost ~]# crontab -l
    no crontab for root

    crontab补充

    也可以直接编辑/etc/crontab文件来实现计划脚本

    [root@localhost ~]# vim /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

    但是使用这种方式有时候不会立刻生效,需要重启crond服务

  • 相关阅读:
    在Dictionary使用foreach的注意
    [公告]新增项目交流区
    博客园Blog程序中又一个奇怪问题
    公告
    网络爬客光顾博客园
    爬网的影响
    致歉
    [业界新闻]中文IT百科Beta版于2006年7月10日正式上线
    公告
    疯狂的爬网
  • 原文地址:https://www.cnblogs.com/telwanggs/p/11547398.html
Copyright © 2011-2022 走看看