霜天部落 | 关注LAMP高性能、高并发架构的设计与研究

linux 定时任务crontab和at

以一定的时间间隔运行作业可以使用crontab,而在指定的时间运行作业的话,应该使用 at 命令。要运行的命令是从 -f 选项指定的文件读取的,如果没有使用 -f,那么从 stdin 读取。-m 选项向用户发送邮件,即使命令没有 stdout。-v 选项显示运行作业的时间。这个时间也显示在输出中。

使用 at 命令举例:

[root@www1 ~]$ at -f attest.sh -v 10:25
Sat Jul 7 10:25:00 2012

job 5 at Sat Jul 7 10:25:00 2007

时间的设置可以非常复杂。清单 7 给出几个示例。参见 at 的手册页、/usr/share/doc/at/timespec 文件或 /usr/share/doc/at-3.1.10/timespec 这样的文件(这个示例中的 3.1.10 是 at 包的版本号)。

如:at 命令使用的时间值

[root@www1 ~]$ at -f attest.sh 10pm tomorrow
job 14 at Sun Jul 8 22:00:00 2012
[root@www1 ~]$ at -f attest.sh 2:00 tuesday
job 15 at Tue Jul 10 02:00:00 2007
[root@www1 ~]$ at -f attest.sh 2:00 july 11
job 16 at Wed Jul 11 02:00:00 2012
[root@www1 ~]$ at -f attest.sh 2:00 next week
job 17 at Sat Jul 14 02:00:00 2012

at 命令还有一个 -q 选项。随着队列的增长,作业的 nice 值也会增长,nice 值表示一个作业对于其他用户的优先程度。还有一个 batch 命令,它与 at 命令相似,但是作业只在系统负载足够低时运行。这些特性的细节参见手册页。

列出调度的作业

使用 crontab 命令和 -l 选项列出 crontab 队列中的作业;使用 atq 命令显示用 at 命令加入队列中的作业。

如果希望查看 at 调度执行的实际命令,那么可以使用 at 命令并加上 -c 选项和作业号。您会注意到,在发出 at 命令时生效的大多数环境设置会随调度的作业一起保存。

删除调度的作业

可以使用 cron 命令和 -r 选项删除所有调度的 cron 作业;要删除系统 cron 或 anacron 作业,应该编辑 /etc/crontab、/etc/anacrontab 或者编辑或删除 /etc/cron.d 目录中的文件。

可以使用 atrm 命令加作业号删除用 at 命令调度的一个或多个作业,多个作业应该用空白分隔。

作业调度的访问权限

除了 /var/spool/cron 中的用户 crontab 文件之外,cron 还会检查 /etc/crontab 文件和 /etc/cron.d 目录中的文件。/etc/crontab 和 /etc/anacrontab 都通过直接编辑进行更新。不使用 crontab 命令更新这些文件或 /etc/cron.d 目录中的文件。

如果文件 /etc/cron.allow 存在,那么非根用户必须在其中列出,才能使用 crontab 和 cron 设施。如果 /etc/cron.allow 不存在,但是 /etc/cron.deny 存在,那么其中列出的非根用户不能使用 crontab 或 cron 设施。如果这两个文件都不存在,那么只允许超级用户使用这个命令。空的 /etc/cron.deny 文件允许所有用户使用 cron 设施,这是默认情况。

/etc/at.allow 和 /etc/at.deny 文件对 at 设施起相似的作用。