Linux 系统可能会面临很多问题,但通常只在工作时间内繁忙。无论是在办公室环境、服务器机房还是在家中,大多数 Linux 系统在早晨、傍晚、夜间和周末都处于空闲状态。利用这些空闲时间可能比购买那些您绝对需要的机器要便宜得多,如果您希望所有事情同时完成的话。
有三种类型的延迟执行
等待一段时间然后恢复作业执行,使用 sleep 命令。执行时间取决于提交时的系统时间。
在指定时间运行命令,使用 at 命令。作业的执行取决于系统时间,而不是提交时间。
定期按月、周、日或小时运行命令,使用 cron 工具。
以下章节将讨论每种可能性。
关于 sleep 的 Info 页面可能是最短的之一。 sleep 命令所做的就是等待。默认情况下,等待时间以秒为单位表示。
那么它为什么存在呢?一些实际例子
有人打电话给你,你说“是的,我半小时后到”,但你已经被工作淹没,肯定会忘记午餐
(sleep1800; echo"午餐时间..") &
当由于某些原因你不能使用 at 命令时,现在是五点钟,你想回家但还有工作要做,而且现在有人正在占用系统资源
(sleep10000; myprogram) &
确保你的系统上有自动注销功能,并且在提交此类作业时注销或锁定你的桌面/办公室,或者在 screen 会话中运行它。
当你运行一系列大型文件的打印输出时,但你希望其他用户能够在中间打印
lplotoftext; sleep900; lphugefile; sleep900; lpanotherlargefile
文件打印在 第 8 章 中讨论。
程序员经常使用 sleep 命令来暂停脚本或程序的执行一段时间。
at 命令在给定时间执行命令,使用你的默认 shell,除非你另行指定(参见 man 手册)。
at 命令的选项相当用户友好,这在下面的例子中得到了证明
steven@home:~> at tomorrow + 2 days warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh at> cat reports | mail myboss@mycompany at> <EOT> job 1 at 2001-06-16 12:36 |
输入 Ctrl+D 退出 at 实用程序并生成 "EOT" 消息。
用户 steven 在这里做了一件奇怪的事情,组合了两个命令;我们将在 第 5 章 “重定向输入和输出”中研究这种做法。
steven@home:~> at 0237 warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh at> cd new-programs at> ./configure; make at> <EOT> job 2 at 2001-06-14 02:00 |
The-m-m 选项在作业完成时向用户发送邮件,或者在作业无法完成时进行解释。 atq 命令列出作业;在提交作业之前执行此命令,以防止它们与其它作业同时启动。使用 atrm 命令,如果你改变主意,可以删除计划的作业。
选择不常见的执行时间是一个好主意,因为系统作业通常在 "整点" 运行,正如你在下一节 4.4.4 节 中看到的那样。例如,作业通常在凌晨 1 点整运行(例如,系统索引以更新标准 locate 数据库),因此输入 0100 可能会很容易地减慢你的系统速度,而不是启动它。为了防止作业在同一时间全部运行,你也可以使用 batch 命令,它将进程排队,并将队列中的工作以均衡的方式馈送到系统,从而防止系统资源使用过度爆发。有关更多信息,请参阅 Info 页面。
cron 系统由 cron 守护进程管理。它从系统和用户的 crontab 条目中获取有关哪些程序以及何时应该运行的信息。只有 root 用户有权访问系统 crontab,而每个用户应该只访问自己的 crontab。在某些系统上,(某些)用户可能无法访问 cron 功能。
在系统启动时,cron 守护进程搜索/var/spool/cron/查找以/etc/passwd中的帐户命名的 crontab 条目,它搜索/etc/cron.d/并且它搜索/etc/crontab,然后每分钟使用此信息检查是否有需要执行的任务。它以 crontab 文件所有者的用户身份执行命令,并将命令的任何输出通过邮件发送给所有者。
在使用 Vixie cron 的系统上,每小时、每天、每周和每月发生的作业都保存在/etc中的单独目录中,以便保持概览,这与标准的 UNIX cron 功能相反,在标准的 UNIX cron 功能中,所有任务都输入到一个大文件中。
Vixie crontab 文件示例
[root@blob /etc]# more crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts # commands to execute every hour 01 * * * * root run-parts /etc/cron.hourly # commands to execute every day 02 4 * * * root run-parts /etc/cron.daily # commands to execute every week 22 4 * * 0 root run-parts /etc/cron.weekly commands to execute every month 42 4 1 * * root run-parts /etc/cron.monthly |
![]() | 或者 |
---|---|
你也可以使用 crontab -l 命令来显示 crontab。 |
设置了一些变量,之后是实际的调度,每个作业一行,以 5 个时间和日期字段开头。第一个字段包含分钟(从 0 到 59),第二个字段定义执行小时(0-23),第三个字段是月份中的日(1-31),然后是月份数(1-12),最后一个是星期几(0-7,0 和 7 都是星期日)。这些字段中的星号表示该字段的完全可接受范围。允许列表;要在周一至周五执行作业,请在最后一个字段中输入 1-5,要在周一、周三和周五执行作业,请输入 1,3,5。
然后是应该运行最后一列中列出的进程的用户。上面的示例来自 Vixie cron 配置,其中 root 用户以适当的目录作为选项,定期运行程序 run-parts。在这些目录中,要在计划时间执行的实际作业存储为 shell 脚本,就像这个每天运行以更新 locate 命令使用的数据库的小脚本一样
billy@ahost cron.daily]$ cat slocate.cron #!/bin/sh renice +19 -p $$ >/dev/null 2>&1 /usr/bin/updatedb -f "nfs,smbfs,ncpfs,proc,devpts" -e \ "/tmp,/var/tmp, /usr/tmp,/afs,/net" |
用户应该使用 crontab -e 命令以安全的方式编辑他们的 crontab。这将防止用户意外打开多个他/她的 crontab 文件副本。默认编辑器是 vi(参见 第 6 章),但如果你更喜欢 GUI 编辑器,你可以使用任何文本编辑器,例如 gvim 或 gedit。
当你退出时,系统会告诉你已安装新的 crontab。
这个 crontab 条目提醒 billy 每周四晚上去他的体育俱乐部
billy:~> crontab -l # DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.20264 installed on Sun Jul 20 22:35:14 2003) # (Cron version -- $Id: chap4.xml,v 1.28 2007/09/19 12:22:26 tille Exp $) 38 16 * * 3 mail -s "sports evening" billy |
在添加新的计划任务后,系统会告诉你已安装新的 crontab。你不需要重启 cron 守护进程来使更改生效。在示例中,billy 添加了一行指向备份脚本的新行
billy:~> crontab -e 45 15 * * 3 mail -s "sports evening" billy 4 4 * * 4,7 /home/billy/bin/backup.sh <--write and quit--> crontab: installing new crontab billy:~> |
Thebackup.sh脚本在每个星期四和星期日执行。有关 shell 脚本的介绍,请参见 7.2.5 节。请记住,命令的输出(如果有)会通过邮件发送给 crontab 文件的所有者。如果未配置邮件服务,你可能会在本地邮箱中找到命令的输出,/var/spool/mail/<your_username>,一个纯文本文件。
![]() | 谁运行我的命令? |
---|---|
你不必指定应该运行命令的用户。默认情况下,它们以用户自己的权限执行。 |