3. 对命令启动的计划

3.1. crontab:报告或编辑您的 crontab 文件

crontab 让您以特定的时间间隔执行命令,而且您还不需要登录。crontab 会将您指定命令的输出通过电子邮件寄送给您。您可以以分钟、小时、天、甚至月来指定间隔。根据选项不同,crontab 的功能会有一定的区别:

  • -l:打印您当前的 crontab 文件;

  • -e:编辑您的 crontab 文件;

  • -r:删除您当前的 crontab 文件;

  • -u <用户>:将上述选项应用到某个<用户>。只有 root 可执行此操作。

让我们首先来编辑一个 crontab。如果您输入 crontab -e,您将会看到您所偏爱的文本编辑器。至于是何编辑器,取决于您在 EDITORVISUAL 环境变量中设置的值,如果没有设置的话将会使用 Vicrontab 文件中的每一行都由六个部分组成。前五个部分是时间间隔,分别对应分钟、小时、月中的天数、月份以及一周中的天数。第六部分是要执行的命令。以 # 开头的行将被当作注释,crond(担负着执行 crontab 文件的程序)会将其忽略。这一格式同保存在 /etc/crontab 的系统 crontab 文件略有差别。其中,第六部分是用户名,系统会以该用户来执行第七部分中的程序。它仅用于执行系统维护任务,以及执行那些仅为了系统安全考量而存在的用户(比如方病毒用户或是运行数据库服务的用户)的任务。以下是 crontab 的一个例子:

[注意]注意

为了让输出更加易读,我们打断了较长的行。不过您在输入的时候一定要确保它们出现在一行上。如果您在行尾遇到了 \ 字符,就应该知道下一行是紧接着上一行的。这种情况同样适用于 Makefile 文件、shell 以及其它环境。

# 如果您不想发送邮件,只需取消以下行的注释
#MAILTO="您的电子邮件地址"
#
# 每两天在下午两点报告上例中的新图像。然后,
#   再重新"touch" "stamp"文件。"%"将被当作
#   换行符,这允许您在同一行放置多个命令。
0 14 */2 * *  find /shared/images              \
  -cnewer /shared/images/stamp                 \
  -a -iregex ".*\.jpe?g"             \
  -a -not -regex                               \
    ".*/old/.*"%touch /shared/images/stamp
#
# 每个圣诞节播放一首歌 :)
0 0 25 12 * mpg123 $HOME/sounds/merryxmas.mp3
#
# 每个星期二下午五点,打印购物清单...
0 17 * * 2 lpr $HOME/shopping-list.txt

除了本例中的之外,还有好几种不同的方法指定间隔。例如,您可以指定一组中间用逗号分开的离散值(1,14,23),也可以使用范围(1-15),甚至组合二者使用(1-10,12-20),并可使用步进增量(1-12,20-27/2)。现在该您自己将理论付诸实践了!

3.2. at:将命令排入一次性计划

您可能想要只在某一天执行一条命令,但并不定期执行。例如,您今天晚上六点有个约会,希望计算机能够提醒您注意。您运行了 X,而且也安装了 X11R6-contrib 软件包,而您想要在五点半的时候得到计算机的通知。at 在这种情况下就能帮到您:

$ at 5:30pm
  # 您现在应该看到"at"提示符
at> xmessage "现在该走了!六点有约会"
  # 按 CTRL-d 可退出
at> <EOT>
job 1 at 2005-02-23 17:30
$

您可以以不同的方式指定时间:

  • now + <间隔>:意味着自现在起指定间隔后(可选。未指定间隔代表现在)。间隔的语法为 <n> (minutes|hours|days|weeks|months)。例如,您可以指定 now + 1 hour(自现在起一小时后),now + 3 days(自现在起三天后)等等。

  • <时间><日期>:完整的指定日期。<时间>参数是必需的。at 能够非常智能地接受您所给出的任何时间参数:您可以输入 010004:202am0530pm1800 或者以下三个特殊值:noon(中午十二点)、teatime(下午四点)和midnight(午夜十二点)。<日期>参数是可选的。您也可以用不同的方式来表示同一个日期,比如 2001年12月20日可以写为 12/20/2001,或者欧洲格式 20.12.2001。您可以省略年份,但此时只能接受欧洲格式:20.12。您还可以用完整的字母来指定月份:Dec 2020 Dec,这都是可以的。

at 还能接受不同的选项:

  • -l:打印当前队列中的任务列表;第一部分是任务编号。这等同于 atq 命令。

  • -d <n>:从队列中删除编号为 <n> 的任务。您可以从 atq 中获得任务编号。这等同于 atrm <n>

如同往常一样,更多选项请您查看 at(1)manpage