美文网首页
at与crontab计划任务

at与crontab计划任务

作者: 互联网中的一个咸鱼 | 来源:发表于2019-08-04 10:19 被阅读0次

    一、 单次任务
    atd 服务负责管理单次任务
    进行单次任务的程序是 at 命令, 管理他的服务是 atd。
    systemctl restart atd
    systemctl enable atd
    systemctl status atd

    工作方式
    我们使用 at 这个指令来产生所要运行的工作,并将这个工作以文本文件的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行了
    实际上有两个权限控制文件,规定了哪些用户可以使用,哪些用户不可以使用
    规则是这样的:
    一行一个用户

    首先查看 /etc/at.allow 文件。
    假如系统中存在此文件,就只允许在此文件的用户使用 at, 其他都拒绝。
    假如没有 /etc/at.allow 文件,就看有没有 /etc/at.deny 文件。
    这个文件意义就是,允许所有,拒绝部分。
    就是在这个文件中的用户是被拒绝的,不在此文件中的用户是被允许的。

    默认CentOS7系统是有一个空的 /etc/at.deny 文件。
    意思是允许所有人使用 at 命令的意思。

    具体操作
    [root@study ~]# at [-mldv] TIME
    [root@study ~]# at -c 工作号码
    选项与参数:
    -m :当 at 的工作完成后,即使没有输出讯息,亦以 email 通知使用者该工作已完成。
    -l :at -l 相当于 atq 命令,列出目前系统上面的所有该使用者的 at 调度;
    -d :at -d 相当于 atrm 命令 ,可以取消一个在 at 调度中的工作;
    -v :可以使用较明显的时间格式列出 at 调度中的工作列表;
    -c :可以列出后面接的该项工作的实际指令内容。

    TIME:
    时间格式,可以定义出『什么时候要进行 at 這项工作』的时间.
    格式有:
    HH:MM 如: 04:00
    在今日的 HH:MM 进行,若时间已过,则在明天的 HH:MM 进行行此工作。
    HH:MM YYYY-MM-DD 如: 04:00 2019-07-28
    強制在某年某月的某一天的特殊時刻進行該工作!
    HH:MM[am|pm] + number [minutes|hours|days|weeks]
    如:
    now + 5 minutes

    04pm + 3 days
    就是說,在某個时间点『再加上几个时间后』才进行。

    示例:
    创建
    [root@kvm-docker ~]# at now + 5 minutes
    at> echo "hello" > /dev/pts/0
    at> <EOT>
    job 1 at Sat Jul 27 18:49:00 2019

    查询
    [root@kvm-docker ~]# atq
    1 Sat Jul 27 18:49:00 2019 a root

    二、周期性的任务

    就是 计划任务

    循环执行的例行性工作调度则是由 cron (crond) 这个系统服务来控制的。
    默认情况下,每个用户都可以通过 crontab 管理自己的计划任务。
    和 at 一样,有两个文件控制权限。

    /etc/cron.allow
    /etc/cron.deny

    使用规则是和之前的 at 的文件一样。
    /etc/cron.allow 比 /etc/cron.deny 要优先, 请永远用一个文件进行控制,别给自己找麻烦!

    crontab -e 设置格式
    命令格式的前一部分是对时间的设定
    后面一部分是要执行的命令。
    关于时间

    参考: cat /etc/crontab

    代表意义
    分钟
    小时
    日期
    月份

    指令

    数字范围
    0-59
    0-23
    1-31
    1-12
    0-7
    命令

    周的数字为 0 或 7 时,都代表“星期天”的意思!
    总结记忆:
    分 时 日 月 星

    除了数字还有几个个特殊的符号:
    就是 *、/ 和 -、, ,

    *代表所有的取值范围内的数字

    / 代表每的意思,*/5 表示每5个单位

    • 代表从某个数字到某个数字

    , 代表分隔时段的意思,就是 和 的意思

    以下举几个例子说明:

    每天早上6点:
    0 6 * * * command

    每两个小时:
    0 */2 * * * command

    23 点到早上7点之间每两个小时, 并且还有早上8点:
    0 23-7/2,8 * * * command

    每个月的 4 号的早上11点和每周的周一到周三的早上11点:
    0 11 4 * 1-3 command

    1月1日早上2点 30 分:
    30 2 1 1 * command

    管理当前用户的计划任务
    创建/再次编辑
    这会调用 vi 打开一个临时文件
    ➜ ~ crontab -e
    */1 * * * * /bin/echo "ok shark"

    编辑好后,想使用 vi 一样保存退出。
    保存后,这个信息会被保存在 /var/spool/cron/ 目录下的和用户同名的文件中。
    比如目前操作的用户是 shark , shark 的计划任务会别保存在 /var/spool/cron/shark 文件中。
    这个文件每个用户只有一个。

    查看
    ➜ ~ crontab -l
    */1 * * * * /bin/echo "ok shark"
    ➜ ~ cat /var/spool/cron/root
    */1 * * * * /bin/echo "ok shark"

    修改/删除一个
    再次使用 crontab -e 命令利用 vi 进行修改和删除单个计划任务。
    删除全部
    crontable -r

    cron 的系统级别的配置文件
    /etc/crontab 和 /etc/cron.d/*
    /etc/crontab
    ➜ ~ 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

    MAILTO=root
    就是执行这个计划任务的命令出错时,或者是该计划任务的执行结果有 STDOUT/STDERR 时,将这些信息发送给 root 用户。
    一般改成自己的账户 MAILTO=shark@my.host.name

    user-name
    执行后面命令的 身份账户
    /etc/crontab 里面当然要指定身份

    /etc/cron.d/*
    在此目录下的所有文件都会被 crond 服务识别为一个计划任务的列表文件。
    ➜ ~ ls /etc/cron.d/
    0hourly
    这个文件,crond 会从 1 到 5 分钟,随机挑选一个时间执行这个文件中的计划任务。

    ➜ ~ cat /etc/cron.d/0hourly

    Run the hourly jobs

    SHELL=/bin/bashin/
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    01 * * * * root run-parts /etc/cron.hourly

    run-parts 脚本会在大约 5 分钟内随机选一个时间来执行 /etc/cron.hourly 目录内的所有可执行文件
    也就是说这里的计划任务是:
    以 root 用户的身份,每个小时的第 1 分钟执行 /etc/cron.hourly 目录下的所有脚本。
    /etc/cron.hourly 目录下必须是可执行文件。

    最佳实战

    不要在统一时间段执行多个计划任务
    将命令的错误输出重定向

    */1 * * * * /bin/echo "hello" 2> /dev/null

    周与日月不可同时并存

    anacron
    作用
    anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非 24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的调度工作。
    其实 anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的调度任务有没有被执行,如果有超过期限的工作在, 就执行该调度任务,执行完毕或无须执行任何调度时,anacron 就停止了。
    crond 与 anacron 的关系:

    crond 会主动去读取 /etc/crontab, /var/spool/cron/, /etc/cron.d/ 等配置文件,并依据“分、时、日、月、周”的时间设置去各项工作调度;
    根据 /etc/cron.d/0hourly 的设置,主动去 /etc/cron.hourly/ 目录下,执行所有在该目录下的可执行文件;
    因为 /etc/cron.hourly/0anacron 这个指令档的缘故,主动的每小时执行 anacron ,并调用 /etc/anacrontab 的配置文件;
    根据 /etc/anacrontab 的设置,依据每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 内的可执行文件,以进行固定周期需要执行的指令。

    也就是说,如果你每个周日的需要执行的动作是放置于 /etc/crontab 的话,那么该动作只要过期了就过期了,并不会被抓回来重新执行。但如果是放置在 /etc/cron.weekly/ 目录下,那么该工作就会定期,几乎一定会在一周内执行一次~如果你关机超过一周,那么一开机后的数个小时内,该工作就会主动的被执行喔! 真的吗?对啦!因为 /etc/anacrontab 的定义啦!

    作者:xiguatian
    链接:https://www.jianshu.com/p/066f6aa07898
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    相关文章

      网友评论

          本文标题:at与crontab计划任务

          本文链接:https://www.haomeiwen.com/subject/bmgirctx.html