查看原文
其他

精通Linux系列十七:定时任务

拾叁 更AI 2023-10-21

精通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 201525 december 2015december 2525 december12/25/201525.12.201520151225todaythursdaynext thursdaynext monthnext year等等。月份的名称可以缩写为三个字母(janfebmar等等)。时间也很灵活:8pm8 pm8:00pm8:00 pm20:002000都是等价的。偏移量是一个加号或减号后面跟着空白和一段时间:+ 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 之间的整数;再次,你可以使用序列,范围,范围序列,或星号。另外,你可以使用三个字母的缩写(janfebmar...),但不能在范围或序列中使用。

  • • 一周中的日期介于 0(星期日)和 6(星期六)之间的整数;再次,你可以使用序列,范围,范围序列,或星号。另外,你可以使用三个字母的缩写(sunmontue...),但不能在范围或序列中使用。

  • • 要执行的命令任何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。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存