Linux基础之任务计划(at,crontab)

在linux系统中你可能已经发现了为什么系统常常会自动的进行一些任务?这些任务到底是谁在支配他们工作的?在linux系统如果你想要让自己设计的备份程序可以自动在某个时间点开始在系统底下运行,而不需要手动来启动它,又该如何处置呢? 这些例行的工作可能又分为一次性定时工作与循环定时工作,在系统内又是哪些服务在负责?

命令at及crontab可以解决上述问题

at:未来的某时间点执行一次某任务

crontab:用于周期性运行某任务

二者的执行结果或通过邮件发送给用户。

at命令

常用格式:at [option] ... TIME

at允许使用一套相当复杂的指定时间的方法。他能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。 上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:now + count time-units ,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。

TIME:时间格式,这里可以定义出什么时候要进行 at 这项任务的时间,格式有:

HH:MM

ex> 04:00

在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此任务。

HH:MM YYYY-MM-DD

ex> 04:00 2016-09-19

强制规定在某年某月的某一天的特殊时刻进行该项任务

HH:MM[am|pm] [Month] [Date]

ex> 04pm September 17

也是一样,强制在某年某月某日的某时刻进行该项任务

HH:MM[am|pm] + number [minutes|hours|days|weeks]

ex> now + 5 minutes

ex> 04pm + 3 days

就是说,在某个时间点再加几个时间后才进行该项任务。

常用选项:

-l:查看作业队列,相当于atq

-f:从指定文件中读取作业任务,而不用再交互式输入

-d:删除指定的作业,相当于atrm

-c:查看指定作业的具体内容

-q:指明队列

注:作业执行结果是以邮件发送给提交作业的用户

在使用at命令前,我们需要先确认at所依赖的atd进程是否启用,使用命令:ps -ef | grep atd查看,若未启用则用/etc/init.d/atd start or restart开启。

执行方式:

1)交互式,在命令输入完成后使用ctrl+d保存退出;2)输入重定向;3)at -f 文件

示例1:2分钟后使用ls命令展开/tmp目录(交互式命令输入结束后使用ctrl+d保存退出)

[[email protected] ~]# at now + 2 minutes 
at> ls /tmp
at> <EOT>
job 7 at Sun Sep 18 09:17:00 2016

命令执行结果在mail里面看

[[email protected] ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 9 messages 1 unread
    1 [email protected]  Tue Jul 19 16:46  90/2915  "[abrt] full crash report"
    2 [email protected]  Thu Sep  8 11:00  16/568   "Output from your job        1"
    3 [email protected]  Mon Sep 12 10:31 353/15306 "[abrt] full crash report"
    4 [email protected]  Mon Sep 12 10:31 443/17535 "[abrt] full crash report"
    5 root                  Sun Sep 18 09:04  23/998   "Output from your job        3"
    6 root                  Sun Sep 18 09:08  19/827   "Output from your job        4"
    7 root                  Sun Sep 18 09:13 275/2986  "Output from your job        5"
    8 root                  Sun Sep 18 09:15  26/552   "Output from your job        6"
>U  9 root                  Sun Sep 18 09:17  18/776   "Output from your job        7"
>U  9 root                  Sun Sep 18 09:17  18/776   "Output from your job        7"
& 9
Message  9:
From [email protected]  Sun Sep 18 09:17:01 2016
Return-Path: <[email protected]>
X-Original-To: root
Delivered-To: [email protected]
Subject: Output from your job        7
To: [email protected]
Date: Sun, 18 Sep 2016 09:17:01 +0800 (CST)
From: [email protected] (root)
Status: RO
systemd-private-2c8c4ebab1524b5c9f463bd2ec8ffea7-colord.service-gyAadP
systemd-private-2c8c4ebab1524b5c9f463bd2ec8ffea7-cups.service-6gB4MM
systemd-private-2c8c4ebab1524b5c9f463bd2ec8ffea7-rtkit-daemon.service-25oPVw
systemd-private-2c8c4ebab1524b5c9f463bd2ec8ffea7-vmtoolsd.service-sW2CqM

示例2:明天14点中,重启系统。(使用输入重定向实现)

[[email protected] ~]# at 14:00 tomorrow >> time1 << eof
> reboot
> eof
job 8 at Mon Sep 19 14:00:00 2016
[[email protected] ~]# atq
8Mon Sep 19 14:00:00 2016 a root

示例3:删除示例2的计划任务

[[email protected] ~]# at -d 8
[[email protected] ~]# atq

at命令的执行权限:

配置文件/etc/at.{allow,deny}决定了允许哪些用户可以使用at命令,哪些用户不可以。

加上这两个文件后, at 的工作情况是这样的:

先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);

如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 命令了。

如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。

透过这个说明,我们知道 /etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为帐号没有在该文件中,就能够运行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 命令的意思 (您可以自行检查一下该文件)。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的帐号写入 /etc/at.deny 即可! 一个帐号写一行。

cron来源于希腊单词chronos(意为“时间”),是linux系统下一个周期性自动执行指定任务的程序

在使用cron前,需要确认crond守护进程处于运行状态,才能保证cron的正常运行。

可以通过命令:systemctl status crond 及ps -ef | grep crond查看服务cron是否处于运行状态。

向crond提交作业的方式与at不同,它需要使用专用的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件;需要使用crontab命令;

cron任务分为两类:

系统cron任务:主要用于实现系统自身的维护

手动编辑/etc/crontab文件

用户cron任务:使用命令crontab

/etc/crontab文件

注:

1)每一行定义一个周期性任务;共7个字段

* * * * * :定义周期性时间

username:运行任务的用户身份

command to be executed:要执行的任务

2)此处的环境变量不同于用户登陆后获得的环境,因此建议命令使用绝对路径,或定义PATH环境变量

3)执行结果邮件发送给MAILTO指定的用户(发送给运行任务的用户)

时间表示法:

(1) 特定值;

给定时间点有效取值范围内的值;

(2) *

给定时间点上有效取值范围内的所有值;

表示“每...”;

示例:

1> 3 * * * * :每小时的第三分钟执行一次

2> 3 4 * * 5 :每周的周五4:03执行一次

3> 5 6 7 * * :每月的7号6:05执行一次

4> 7 8 9 10 * :每年10月9号8点7分执行一次

(3) 离散取值:在时间上使用逗号分隔的多个值:#,#,#

示例:

5> 9 8 * * 3,7 :每周三周日的8点9分执行一次

6> 0 8,20 * * 3,7 :每周三周日的8:00跟20:00执行一次

(4) 连续取值:在时间点上使用-链接开头和结束:#-#

示例:

7> 0 9-18 * * 1-5 :从周一到周五的9点到18点每小时执行一次

(5) 在指定时间范围上,定义步长:

/#: #即为步长

注:1)指定时间点不能被步长整除时,其意义将不复存在:

2)最小时间单位为“分钟”,想完成“秒”级任务,需要借助于其他机制:定义成每分钟任务,而在利用脚本实现的每分钟之内循环多次

用户cron

crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME

只有该用户定义了cron任务才能通过该文件看到相应信息。

注:1)每行定义一个cron任务,共6个字段(不需要指定用户);2)邮件发送给当前用户

crontab命令

使用格式:

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

-l: 列出所有任务;

-e: 编辑任务;

-r: 移除所有任务;

-i:同-r一同使用,以交互式模式让用户有选择地移除指定任务;

-u user: 仅root可运行,代为为指定用户管理cron任务;

注意:运行结果以邮件通知给相关用户;如果不想接收邮件则可使用如下命令实现

(1) COMMAND > /dev/null

(2) COMMAND &> /dev/null

思考:

(1) 如何在秒级别运行任务?

* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done

(2) 如何实现每7分钟运行一次任务?

sleep命令:

sleep NUMBER[SUFFIX]...

SUFFIX:

s: 秒, 默认

m: 分

h: 小时

d: 天

练习:

1、每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz”;

在/etc/crontab文件中添加如下:

0 4 * * * ./test/bak_etc

cat bak_etc

#!/bin/bash

#bakup /etc diratory

#auther chawan date:20160908

cp /etc/* /bakup/etc$(date +%F-%H)

xz /bakup/etc$(date +%F-%H)

2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”;

* * * * 2,4,7 ./test/logs

cat /test/logs

#!/bin/bash

#bakup /var/log/messages to /logs

cp /var/log/messages /logs/messages$(date +%F)

xz /logs/messages$(date +%F)

3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中;

0 2 * * * cat /proc/meminfo | grep "^[SM]" >> /tmp/meminfo.txt

4、工作日时间内,对用户docker每小执行一次“ip addr show”命令;

切换至docker用户使用命令crontab -e进入编辑界面

加入"0 9-18 * * 1-5 docker ip addr show"信息后保存退出

[[email protected] ~]$ crontab -l

0 9-18 * * 1-5 ip addr show

时间: 2024-10-24 07:55:52

Linux基础之任务计划(at,crontab)的相关文章

Linux基础命令之计划任务

一.计划任务 1.at 只能执行一次 语法: at  时间 服务:atd  必须开启          1.[[email protected] ~]# /etc/init.d/atd status   #查看服务状态          2.atd (pid  2206) is running...          3.[[email protected] ~]# /etc/init.d/atd start    #启动服务 [例如]          1.[[email protected]

Linux基础学习-crond系统计划任务

系统计划任务 大部分系统管理工作都是通过定期自动执行某个脚本来完成的,那么如何定期执行某个脚本,从而实现运维的自动化,这就要借助Linux的cron功能了. 计划任务分为一次性计划任务和周期性计划任务. 一次性计划任务 每晚11店30分开启网站服务. 周期性计划任务 每周一的凌晨3点30分把/var/www/html目录打包备份为backup.tar.gz 顾名思义,一次性计划任务只执行一次,一般用于满足临时的工作需求,可以使用at命令实现. 如果你的Linux没有此命令可以使用yum inst

Linux任务计划 (at,crontab)

Linux中的任务计划,定时执行某些任务或周期性的执行某些任务 任务计划: 在未来时间点一次性执行某任务:at, batch 周期性执行某任务: crontab 执行完任务后,liunx会通过邮件来告当前用户 电子邮件服务:smtp: simple mail transmission protocol linux中的路径:/var/spool/mail/USERNAME 查看邮件命令:yum install mailx 安装邮件服务 mail命令: mail: 进入交互式收发邮件接口: mail

Linux计划任务Crontab实例详解教程

说明:Crontab是Linux系统中在固定时间执行某一个程序的工具,类似于Windows系统中的任务计划程序 下面通过详细实例来说明在Linux系统中如何使用Crontab 操作系统:CentOS 一.安装crontab yum install vixie-cron  #安装 chkconfig crond on  #设为开机启动,先要安装chkconfig(yum install chkconfig) service crond start  #启动 service crond stop  

Linux 计划任务 Crontab 笔记与总结(2)Crontab 的基本组成与配置

[Crontab 的基本组成] ① 系统服务 CROND:每分钟都会从配置文件刷新定时任务 ② 配置文件 :文件方式设置定时任务 ③ 配置工具 crontab:用途调整定时任务 [配置文件的配置文件格式] * * * * * COMMAND 第一个 * :分钟 0 - 59,* 表示每分钟都要执行 第二个 * :小时 0 - 23 第三个 * :日期  1 - 31 第四个 * :月份 1 - 12 第五个 * :星期 0 - 7(0 或 7 表示星期天) [例1]每晚的 21:30 重启 Ap

Linux 基础入门----推荐课程

Linux 基础入门课程:https://www.shiyanlou.com/courses/1 很好的一门Linux基础课,精炼.简洁!推荐! 课程内容: 第1节 Linux 系统简介 https://www.shiyanlou.com/courses/1/labs/1/document 第2节 基本概念及操作 https://www.shiyanlou.com/courses/1/labs/2/document 第3节 用户及文件权限管理 https://www.shiyanlou.com/

我的LINUX基础笔记

Linux系统管理      1 Day   2014.5.23 su -name   切换用户passwd 密码   更改密码gnome-terminal    伪CLI   桌面终端程序1.查看内核版本uname -r    2.查看红帽系统版本cat /etc/redhat-rdlease3.查看LINUX标准分发版信息  lsb_release4.查看网卡的IP,MAX       ifconfig                       ifconfig eth 10.0.0.10

linux系统-进程管理-计划任务

linux系统-进程管理-计划任务 一 计划任务命令 1 at 某一时刻执行任务 2 batch 在系统负载不重的时候执行 3 cron 周期性执行 二 at命令及使用 1 at [-f文件名]时间 2 at [-d删除任务] 3 at [-l查看任务] 4 绝对计时法:hh:mm MM/DD/YY at 17:30 4/18/15 5 交互方式:at 9:00 6 使用命令文件的方式:生成文件at.script 使用at命令 at -f at.srcipt 9:00 4/18/15 or at

老男孩26期运维班linux基础知识大比拼即将开始

老男孩26期运维班linux基础知识大比拼 1 比赛说明 比赛时间:2015年11月12日下午15点 比赛地点:老男孩教育教室二 比赛人员:老男孩教育26期全体同学 奖项:团体奖(按组奖励共1-9组): 一等奖奖励300元人民币或每人老男孩老师新书一本和老师合影签名. 二等奖奖励200元人民币 三等奖奖励100元人民币 个人奖:3名,赠老男孩新书一本 惩罚:没有得奖的组,或者组内无人得奖的组,罚100元或派选代表表演一个节目(唱歌或其它) 比赛规则当场宣布: 主评委:老男孩老师,张导 辅助评委: