Linux任务计划(at、batch、cron)

Linux中有两类任务计划,第一种是某个时间执行一次,用at来实现;另一种是周期性执行任务,用cron来实现。

  1. Linux本地电子邮件服务
  2. at系列:一次性计划任务
    2.1 at命令
    2.2 batch命令
  3. cron:周期性任务计划
    3.1、crond配置文件
    3.2、cron任务中的时间表示
    3.3、crontab命令

任务计划的执行结果默认都用邮件来通知用户,所以先来介绍一下Linux系统的邮件功能。

1、Linux本地电子邮件服务

常见的邮件协议有以下三种:

  • smtp:simple mail transmission protocol:简单邮件传输协议
  • pop3: post office porotocol:邮局协议
  • imap4: internet mail access protocol, 互联网邮件访问协议

Linux中使用mail或mailx命令来实现本地电子邮件服务。

  • mailx - send and receive Internet mail
    最常用的是-s subject选项,指定邮件主题。

生成邮件正文的三种方式

  1. 交互式输入:.单独成行可以表示正文结束;Ctrl+d提交亦可;
    [root@localhost ~]# mail -s 'test mail from root' user1 #发送一封主题为test mail from root的邮件到user。
    hello user1.
    from root!
    . # .点单独成行,邮件正文结束。
    EOT
    [root@localhost ~]# su - user1
    [user1@localhost ~]$ mail #切换到user1,用mail收邮件,可以看到一封新邮件。
    Heirloom Mail version 12.4 7/29/08. Type ? for help.
    "/var/spool/mail/user1": 1 message 1 new
    >N 1 root Sun Jun 10 11:38 19/637 "test mail from root"

  2. 通过输入重定向,将文件内容附到正文中。
    [user1@localhost ~]$ mail -s 'file passwd' root < /etc/passwd #将/etc/passwd文件的内容附到正文发送给root。
    [user1@localhost ~]$ exit
    logout
    You have mail in /var/spool/mail/root
    [root@localhost ~]# mail #root用户收到邮件。
    Heirloom Mail version 12.4 7/29/08. Type ? for help.
    "/var/spool/mail/root": 1 message 1 new
    >N 1 user1@localhost.loca Sun Jun 10 11:49 37/1493 "file passwd"
    & 1 #查看邮件。
    Message 1:
    From user1@localhost.localdomain Sun Jun 10 11:49:10 2018
    Return-Path: <user1@localhost.localdomain>
    X-Original-To: root
    Delivered-To: root@localhost.localdomain
    Date: Sun, 10 Jun 2018 11:49:09 +0800
    To: root@localhost.localdomain
    Subject: file passwd
    User-Agent: Heirloom mailx 12.4 7/29/08
    Content-Type: text/plain; charset=us-ascii
    From: user1@localhost.localdomain
    Status: R
    #以下为邮件正文内容。
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    以下省略

  3. 使用cat命令,通过管道,将文件内容输出重定向到邮件正文。
    [root@localhost ~]# cat /etc/fstab | mail -s 'file fstab' user1 #将/etc/fstab文件内容附到正文发送给user1。
    [root@localhost ~]# su - user1
    [user1@localhost ~]$ mail #切换到user1,使用mail收取邮件。
    Heirloom Mail version 12.4 7/29/08. Type ? for help.
    "/var/spool/mail/user1": 2 messages 1 new
    1 root Sun Jun 10 11:38 20/648 "test mail from root"
    >N 2 root Sun Jun 10 11:53 32/1383 "file fstab"
    & 2 #查看主题名为“file fstab”的邮件
    Message 2:
    From root@localhost.localdomain Sun Jun 10 11:53:50 2018
    Return-Path: <root@localhost.localdomain>
    X-Original-To: user1
    Delivered-To: user1@localhost.localdomain
    Date: Sun, 10 Jun 2018 11:53:50 +0800
    To: user1@localhost.localdomain
    Subject: file fstab
    User-Agent: Heirloom mailx 12.4 7/29/08
    Content-Type: text/plain; charset=us-ascii
    From: root@localhost.localdomain (root)
    Status: R
    #邮件正文为/etc/fstab文件的内容。
    #
    # /etc/fstab
    # Created by anaconda on Sat Jun 2 10:39:48 2018
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
    UUID=bc141b9a-bdda-44c7-991a-f56e9cee8f6a /boot ext4 defaults 1 2
    /dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
    tmpfs /dev/shm tmpfs defaults 0 0
    以下省略

2、at系列:一次性计划任务

在未来某一时刻一次性执行某任务。

  • at, batch, atq, atrm - queue, examine or delete jobs for later execution

at是一个命令系列,包含at、batch、atq、atrm4个命令。

2.1、at命令

at [OPTION]... TIME

OPTION
-l:查看作业队列,相当于atq命令
-f /PATH/FROM/SOMEFILE:从指定文件中读取作业任务,而非交互式输入
-d #:#是作业号,删除指定作业,相当于atrm #命令
-c:查看指定作业的具体内容;
-q QUEUE: 指明队列;

TIME

  1. 确切的某一时刻:
    HH:MM[YYYY-mm-dd]
    noon: 中午12点
    midnight:午夜12点
    teatime:下午4点
    tomorrow
  2. 指定从现在起往后的某个时刻:
    now+#UNIT
    (UNIT: minutes, hours, days, weeks)
    如:2分钟后执行ls /etc命令。
    [root@localhost ~]# at now+2min #指定任务执行时间。
    at> ls /etc
    at> <EOT> #指定任务内容,完成后Ctrl+D提交。
    job 1 at 2018-06-10 12:08
    [root@localhost ~]# atq
    3 2018-06-10 12:16 a root #atq查看任务列表,也可以使用at -l。
    [root@localhost ~]# mail #执行成功后,会收到邮件。
    Heirloom Mail version 12.4 7/29/08. Type ? for help.
    "/var/spool/mail/root": 2 messages 1 new
    1 user1@localhost.loca Sun Jun 10 11:49 38/1504 "file passwd"
    >N 2 root Sun Jun 10 12:16 164/1874 "Output from your job 3"
    & 2
    Message 2:
    From root@localhost.localdomain Sun Jun 10 12:16:01 2018
    Return-Path: <root@localhost.localdomain>
    X-Original-To: root
    Delivered-To: root@localhost.localdomain
    Subject: Output from your job 3
    To: root@localhost.localdomain
    Date: Sun, 10 Jun 2018 12:16:01 +0800 (CST)
    From: root@localhost.localdomain (root)
    Status: R
    #邮件正文内容为ls /etc的内容。
    adjtime
    aliases
    aliases.db
    alternatives
    anacrontab
    以下省略

2.2、batch命令

batch命令的用法和at相似,只不过它不用指定任务执行的时间,而是在系统空闲时自动执行指定的任务。
如:在系统空闲时执行ls /var,如果设定任务时系统是空闲的,那么这条命令会立即执行。
[root@localhost ~]# batch #batch命令不需要指定时间。
at> ls /var
at> <EOT>
job 4 at 2018-06-10 12:19
[root@localhost ~]# mail #在邮件中查看执行结果。
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/root": 3 messages 1 new
1 user1@localhost.loca Sun Jun 10 11:49 38/1504 "file passwd"
2 root Sun Jun 10 12:16 165/1885 "Output from your job 3"
>N 3 root Sun Jun 10 12:20 30/578 "Output from your job 4"
& 3
Message 3:
From root@localhost.localdomain Sun Jun 10 12:20:07 2018
Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Subject: Output from your job 4
To: root@localhost.localdomain
Date: Sun, 10 Jun 2018 12:20:07 +0800 (CST)
From: root@localhost.localdomain (root)
Status: R
#邮件正文为ls /var的内容。
cache
crash
db
empty
games
以下省略

3、cron:周期性任务计划

cron可以实现系统周期性地执行某一任务,它是由cronie程序包提供的功能,有crond守护进程和相关辅助工具。
[root@localhost ~]# rpm -q cronie
cronie-1.4.4-15.el6.x86_64
要使用cron制定周期性任务,必须确保crond守护进程处于运行状态,并设置了开机启动:
[root@localhost ~]# service crond status
crond (pid 1520) is running...
[root@localhost ~]# chkconfig | grep crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off

3.1、crond配置文件

向crond提交作业任务需要使用专用的配置文件。
cron任务分为两类,系统cron任务和用户cron任务,所以对应的配置文件也有两类:

  • 系统cron任务
    系统cron任务需要通过手动编辑/etc/crontab配置文件。配置文件的格式如下:
    SHELL=/bin/bash #执行任务所使用的SHELL。
    PATH=/sbin:/bin:/usr/sbin:/usr/bin #SHELL的PATH变量。
    MAILTO=root #任务执行结果需要通知的用户。
    HOME=/

    # For details see man 4 crontabs #需要查看详细说明,使用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

    每一行定制一个周期性任务,共7个字段:

    1. * * * * *,前5个字段用于定义任务执行的周期性时间,按顺序分别表示的单位为:分、时、日、月、周,具体的时间格式后面会单独说明;
    2. user-name,指定运行任务的用户身份;
    3. command to be executed,要执行的具体任务。
      这里需要注意,由于cron中的PATH变量和系统中的可能不同,所以要使用命令的绝对路径,或在配置文件中的PATH字段中添加路径。
  • 用户cron任务
    用户cron任务的配置文件为/var/spool/cron/USERNAME。
    配置文件格式和系统cron大致相同,但在定制任务时不需要指定用户身份。
    用户cron任务建议使用crontab命令来进行配置,具体命令用法后面会详细说明。

3.2、cron任务中的时间表示

前面已经提到,周期性时间由每一行的前5个字段表示,时间单位分别为:分、时、日、月、周,时间的指定有5种方法。

  1. 特定值
    此值必须为给定时间单位的有效范围内的值,比如:在“时”这个字段上,只能指定1-24之间的值。
    另外需要注意,“月”和“周”两个字段一般不要同时使用。
  2. 所有值,用“*”表示
    表示给定时间单位的有效范围内的所有值,表示“每..”。比如:在“分”的字段上指定为“*”,表示每分钟。
  3. 离散值,中间用“,”分隔
  4. 连续值,中间用“-”连接
  5. 定义步长,用“/”表示
    比如,在“时”的字段上指定“*/2”,表示每两小时。
    注意:给定时间单位的有效范围内的最大值要能被指定的步长整除,否则无效。比如:在“分”的字段上,不可以指定“*/7”,因为60不能被7整除。
  • 时间表示示例
    (1) 3 * * * *: 每小时执行一次,时间是每小时的第3分钟;
    (2) 3 4 * * 5: 每周执行一次,时间是每周五4时3分;
    (3) 5 6 7 * *:每月执行一次,时间是每月7号的6时5分
    (4) 7 8 9 10 *: 每年执行一次,时间是每年的10月9号8点7分
    (5) 9 8 * * 3,7: 每周三和周日的8点9分
    (6) 0 8,20 * * 3,7: 每周三和周日的8点和20点
    (7) 0 9-18 * * 1-5:工作时间内的每小时执行一次
    (8) */5 * * * *: 每5分钟执行一次

3.3、crontab命令

crontab - maintain crontab files for individual users
crontab [-u user] [-l | -r | -e] [-i]

  • 常用选项
    -e: 编辑任务;
    -l: 列出所有任务;
    -r:移除所有任务;即删除/var/spool/cron/USERNAME文件;
    -i: 在使用-r选项移除所有任务时,提示用户确认;
    -u user:root用户可为指定用户管理cron任务

  • 示例

  1. 在root用户下,为user1用户制定每小时执行一次cat /etc/fstab的周期性任务:
    [root@localhost cron]# crontab -u user1 -e #-u指定user1,-e编辑
    no crontab for user1 - using an empty one
    0 * * * * /bin/cat /etc/fstab #编辑周期性任务内容
    crontab: installing new crontab
    [root@localhost cron]# crontab -u user1 -l #查看周期性任务
    0 * * * * /bin/cat /etc/fstab
    [root@localhost cron]# ls /var/spool/cron
    user1 #设定成功后,/var/spool/cron目录下会有一个以用户名命名的文件,其中的内容就是刚刚设置的周期性任务。

  2. 制定每周三凌晨三、五点10分执行某个脚本,输出当前时间,时间格式为 2017-12-28 10:00:00:
    [root@localhost cron_test]# vim date.sh #编辑脚本
    date +"%Y-%m-%d %H:%M:%S"
    [root@localhost cron_test]# bash date.sh #测试脚本
    2018-06-11 12:34:41
    [root@localhost cron_test]# crontab -e #设置周期性任务
    10 3,5 * * 3 /bin/bash /tmp/testdir/cron_test/date.sh
    crontab: installing new crontab

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容