精通Linux系列十七:定时任务
精通Linux系列点击关注公众号,AI&编程干货及时送达
定时任务
命令 | 含义 |
sleep | 等待一定的秒数,不做任何事情。 |
watch | 在设定的间隔时间里运行一个程序。 |
at | 安排一个在未来某个时间点只运行一次的任务。 |
crontab | 安排在未来多个时间点运行的任务。 |
如果你需要在特定的时间或者固定的间隔里启动程序,Linux 提供了几种不同复杂度的定时工具。
sleep
stdin stdout - file -- opt --help --version*
sleep 时间指定
sleep
命令只是简单地等待一定的时间。给定的时间指定可以是整数(表示秒)或者一个整数后面跟着字母s
(也是秒)、m
(分钟)、h
(小时)或者d
(天)。比如:
→ sleep 5m 闲置 5 分钟
sleep
在你需要延迟一个命令一定的时间时很有用:
→ sleep 10 && echo '十秒过去了。'
(10 秒过去了)
十秒过去了。
watch
stdin stdout - file -- opt --help --version*
watch [选项] 命令
watch
程序在设定的间隔执行给定的命令,默认是每两秒。命令被传给 shell(所以要确保引用或转义任何特殊字符),结果在全屏模式下显示,这样你就可以方便地观察输出并看到有什么变化。例如,watch -n 60 date
每分钟执行一次 date
命令,可以看作是一个简易时钟。按 ^C
退出。
有用的选项
-n seconds | 设置执行间隔时间,以秒为单位。 |
-d | 高亮输出中的差异,强调从一个执行到下一个执行过程中有什么变化。 |
-g | 当命令产生的输出与上一次执行的输出不同时退出。 |
at
stdin stdout - file -- opt --help --version
at [选项] 时间指定
at
命令在指定的时间只运行一次 shell 命令:
→ at 7am next sunday
at> echo 记得去购物 | mail smith
at> lpr $HOME/shopping-list
at> ^D
<EOT>
job 559 at 2015-09-14 21:30
at
所能理解的时间指定非常灵活。一般来说,你可以指定:
• 时间后跟日期(而不是日期后跟时间)
• 仅日期(默认为当前时钟时间)
• 仅时间(默认为最近的一次,无论是今天还是明天)
• 诸如
now
(现在)、midnight
(午夜)或teatime
(16:00)等特殊词语• 以上任意一种后面跟一个偏移量,如“+ 3 days”
日期可以有多种形式:december 25 2015
,25 december 2015
,december 25
,25 december
,12/25/2015
,25.12.2015
,20151225
,today
,thursday
,next thursday
,next month
,next year
等等。月份的名称可以缩写为三个字母(jan
,feb
,mar
等等)。时间也很灵活:8pm
,8 pm
,8:00pm
,8:00 pm
,20:00
,2000
都是等价的。偏移量是一个加号或减号后面跟着空白和一段时间:+ 3 seconds
,+ 2 weeks
,- 1 hour
等等。
如果你没有指定日期或时间的一部分,at
会从系统日期和时间中复制缺失的信息。所以“next year”(明年)表示从现在起的一年,“thursday”(星期四)表示接下来的星期四在当前的时钟时间,“december 25”(12月25日)表示接下来的12月25日,“4:30pm”(下午4:30)表示未来最早的一次下午4:30。
你提供给at
的命令在执行时才会被 shell 评估,所以通配符、变量和其他 shell 构造直到那时才会展开。而且,你当前的环境(参见 printenv
)在每个任务中都会被保留,所以它执行的就像你已经登录了。然而,别名在at
任务中不可用,所以不要包含它们。
要列出你的at
任务,使用 atq
(“at queue”):
→ atq
559 2015-09-14 07:00 a smith
要删除一个 at
作业,请运行 atrm
(“at 删除”)并附带作业编号:
→ atrm 559
实用选项
-f 文件名 | 从给定文件而不是标准输入中读取命令。 |
-c 作业编号 | 将作业命令打印到标准输出。 |
crontab
stdin stdout - file -- opt --help --version
crontab [options] [file]
crontab
命令就像 at
命令一样,可以为特定时间安排作业。但是,crontab
是用于重复的作业,例如“每月第二个星期二的午夜运行这个命令。”为了实现这一点,你编辑并保存一个文件(称为你的 crontab 文件),它会自动安装在一个系统目录(*/var/spool/cron*)中。每隔一分钟,一个名为 cron
的Linux进程就会醒来,检查你的 crontab 文件,并执行任何到期的作业。
•
→ **
crontab -e**
在默认编辑器($VISUAL
)中编辑你的 crontab 文件。•
→ **
crontab -l**
在标准输出上打印你的 crontab 文件。•
→ **
crontab -r**
删除你的 crontab 文件。•
→ **
crontab myfile**
将文件 myfile 安装为你的 crontab 文件。
超级用户可以添加选项 -u
用户名
来处理其他用户的 crontab 文件。
Crontab 文件每行包含一个作业。(空行和以“#
”开头的注释行被忽略。)每行有六个字段,用空格隔开。前五个字段指定运行作业的时间,最后一个是作业命令本身。
• 小时内的分钟数介于 0 和 59 之间的整数。这可以是一个数字(
30
),用逗号隔开的一系列数字(0,15,30,45
),一个范围(20–30
),一系列范围(0-15,50-59
),或一个星号表示“全部”。你也可以用后缀/
n
指定“每n
次”;例如,*/12
和0-59/12
都表示0,12,24,36,48
(即,每 12 分钟一次)。• 一天中的小时数和分钟的语法一样。
• 月份中的日期介于 1 和 31 之间的整数;再次,你可以使用序列,范围,范围序列,或星号。
• 一年中的月份介于 1 和 12 之间的整数;再次,你可以使用序列,范围,范围序列,或星号。另外,你可以使用三个字母的缩写(
jan
,feb
,mar
...),但不能在范围或序列中使用。• 一周中的日期介于 0(星期日)和 6(星期六)之间的整数;再次,你可以使用序列,范围,范围序列,或星号。另外,你可以使用三个字母的缩写(
sun
,mon
,tue
...),但不能在范围或序列中使用。• 要执行的命令任何shell命令,将在你的登录环境中执行,所以你可以引用像
$HOME
这样的环境变量并期望它们能工作。使用你的命令的绝对路径(例如,用 /usr/bin/who 而不是who
)以确保cron
运行的是正确的程序,因为一个 Linux 系统可能有几个同名的程序。
以下是一些示例时间规格:
* * * * * | 每分钟 |
45 * * * * | 每小时后的 45 分钟(1:45,2:45 等) |
45 9 * * * | 每天上午 9:45 |
45 9 8 * * | 每个月的第八天上午 9:45 |
45 9 8 12 * | 每年 12 月 8 日上午 9:45 |
45 9 8 dec * | 每年 12 月 8 日上午 9:45 |
45 9 * * 6 | 每周六上午 9:45 |
45 9 * * sat | 每周六上午 9:45 |
45 9 * 12 6 | 每年 12 月的每个周六上午 9:45 |
45 9 8 12 6 | 每年 12 月的每个周六以及 12 月 8 日上午 9:45 |
如果命令在执行时产生任何输出,cron
会将其发送到你的邮箱(或更准确地说,发送到该 crontab 文件的所有者的邮箱)。
推荐阅读
你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。