本章介绍如何使用 crontab 和 at 命令来调度例程或单个(一次)系统任务。
本章还说明如何使用以下文件来控制对上述命令的访问:
cron.deny
cron.allow
at.deny
有关与调度系统任务关联的过程信息,请参见以下内容:
任务 |
说明 |
参考 |
---|---|---|
创建或编辑 crontab 文件。 |
使用 crontab -e 命令来创建或编辑 crontab 文件。 | |
验证 crontab 文件是否存在。 |
使用 ls -l 命令验证 /var/spool/cron/crontabs 文件的内容。 | |
显示 crontab 文件。 |
使用 ls -l 命令显示 crontab 文件。 | |
删除 crontab 文件。 |
crontab 文件设置时使用了受限权限。使用 crontab -r 命令而不是 rm 命令删除 crontab 文件。 | |
拒绝 crontab 访问。 |
要拒绝用户对 crontab 命令的访问,请通过编辑 /etc/cron.d/cron.deny 文件将用户名添加到该文件中。 | |
将 crontab 访问限制于指定的用户。 |
要允许用户访问 crontab 命令,请将用户名添加到 /etc/cron.d/cron.allow 文件中。 |
可以设置多个要自动执行的系统任务。其中有些任务应该以固定间隔进行。其他任务只需运行一次,可能是在晚间或周末等非高峰时间。
本节包含有关 crontab 和 at 这两个命令的概述信息,使用这两个命令可以调度要自动执行的例程任务。crontab 命令用于调度重复性任务。at 命令则用于调度只执行一次的任务。
下表概括说明了 crontab 和 at 命令,以及可用来控制对这些命令的访问的文件。
表 8–1 命令摘要:调度系统任务
命令 |
调度内容 |
文件位置 |
控制访问的文件 |
---|---|---|---|
crontab |
固定间隔的多个系统任务 |
/var/spool/cron/crontabs |
/etc/cron.d/cron.allow 和 /etc/cron.d/cron.deny |
at |
单个系统任务 |
/var/spool/cron/atjobs |
/etc/cron.d/at.deny |
也可以使用 Solaris Management Console 的调度作业工具来调度例程任务。有关使用和启动 Solaris Management Console 的信息,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
可以使用 crontab 命令来调度例程系统管理任务,使其每日、每周或每月执行一次。
从临时目录中删除几天前的文件
执行记帐摘要命令
使用 df 和 ps 命令捕获系统快照
执行每日安全监视
运行系统备份
列出在特定月份中未使用的文件
生成每月记帐报告
此外,用户还可以调度 crontab 命令以执行其他例程系统任务,例如发送提醒和删除备份文件。
有关调度 crontab 作业的逐步说明,请参见如何创建或编辑 crontab 文件。
通过 at 命令可以调度要在以后执行的作业。该作业可由单个命令或脚本组成。
与 crontab 类似,使用 at 命令可以调度例程任务的自动执行。但与 crontab 文件不同的是,at 文件只执行一次任务。然后,便从目录中删除这些文件。因此,在运行将输出定向到独立文件中以供以后检查的单个命令或脚本时,at 命令很有用。
提交 at 作业包括键入命令并按照 at 命令语法指定选项来调度执行作业的时间。有关提交 at 作业的更多信息,请参见at 命令的说明。
at 命令在 /var/spool/cron/atjobs 目录中存储您运行的命令或脚本以及当前环境变量的副本。at 作业文件名是一个长数字,用于指定该文件在 at 队列中的位置,后跟 .a 扩展名,例如 793962000.a。
cron 守护进程在启动时检查 at 作业并侦听是否提交了新作业。cron 守护进程执行 at 作业后,将从 atjobs 目录中删除 at 作业的文件。有关更多信息,请参见 at(1) 手册页。
有关调度 at 作业的逐步说明,请参见如何创建 at 作业。
以下各节介绍如何创建、编辑、显示和删除 crontab 文件,以及如何控制对这些文件的访问。
cron 守护进程会根据在每个 crontab 文件中找到的命令来调度系统任务。crontab 文件由命令组成,每个命令占据一行,这些命令将以固定间隔执行。每行开头包含日期和时间信息,以告知 cron 守护进程何时执行命令。
例如,在 SunOS 软件安装期间将提供名为 root 的 crontab 文件。该文件的内容包括以下命令行:
10 3 * * * /usr/sbin/logadm (1) 15 3 * * 0 /usr/lib/fs/nfs/nfsfind (2) 1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1 (3) 30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean (4) |
下面介绍了上述每个命令行的输出:
第一行在每天凌晨 3:10 运行 logadm 命令。
第二行在每个星期日凌晨 3:15 执行 nfsfind 脚本。
第三行在每天凌晨 2:10 运行用于检查夏时制时间(并根据需要进行更正)的脚本。
如果没有 RTC 时区,也没有 /etc/rtc_config 文件,则此项不执行任何操作。
/usr/sbin/rtc 脚本只能在基于 x86 的系统上运行。
第四行在每天凌晨 3:30 检查(并删除)通用安全服务表 /etc/gss/gsscred_db 中的重复项。
有关 crontab 文件中各行语法的更多信息,请参见crontab 文件项的语法。
crontab 文件存储在 /var/spool/cron/crontabs 目录中。在 SunOS 软件安装期间,会提供包括 root 在内的若干个 crontab 文件。请参见下表。
表 8–2 缺省 crontab 文件
crontab 文件 |
功能 |
---|---|
adm |
记帐 |
lp |
打印 |
根 |
一般系统功能和文件系统清除 |
sys |
性能数据收集 |
uucp |
一般 uucp 清除 |
除了缺省的 crontab 文件之外,用户还可以创建 crontab 文件,以调度自己的系统任务。其他 crontab 文件按用来创建它们的用户帐户名称(如 bob、mary、smith 或 jones)命名。
要访问属于 root 或其他用户的 crontab 文件,需要具有超级用户权限。
后续各节介绍了说明如何创建、编辑、显示和删除 crontab 文件的过程。
cron 守护进程可管理 crontab 命令的自动调度。cron 守护进程将检查 /var/spool/cron/crontab 目录中是否存在 crontab 文件。
cron 守护进程在启动时执行以下任务:
检查新的 crontab 文件。
阅读文件中列出的执行时间。
在适当时间提交执行命令。
侦听来自 crontab 命令的有关更新的 crontab 文件的通知。
cron 守护进程以几乎相同的方式来控制 at 文件的调度。这些文件存储在 /var/spool/cron/atjobs 目录中。cron 守护进程还侦听来自 crontab 命令的有关已提交的 at 作业的通知。
crontab 文件由命令组成,每个命令占据一行,这些命令将按每个命令行的前五个字段指定的时间自动执行。下表中介绍了这五个字段,它们以空格分隔。
表 8–3 crontab 时间字段的可接受值
时间字段 |
值 |
---|---|
分钟 |
0-59 |
小时 |
0-23 |
月中某日 |
1-31 |
月份 |
1-12 |
星期中某日 |
0-6(0 = 星期日) |
在 crontab 时间字段中使用特殊字符时请遵循以下规则:
使用空格分隔每个字段。
使用逗号分隔多个值。
使用连字符指定某一范围的值。
使用星号作为通配符来包括所有可能值。
在一行开头使用注释标记 (#) 来表示注释或空白行。
例如,以下 crontab 命令项将于每月第一天和第十五天下午 4 点在用户的控制台窗口中显示提醒。
0 16 1,15 * * echo Timesheets Due > /dev/console |
crontab 文件中的每个命令必须只占据一行,即使这一行非常长也是如此。crontab 文件不识别额外的回车。有关 crontab 项和命令选项的更多详细信息,请参阅 crontab(1) 手册页。
创建 crontab 文件的最简单方法是使用 crontab -e 命令。此命令会调用已为系统环境设置的文本编辑器。系统环境的缺省编辑器在 EDITOR 环境变量中定义。如果尚未设置此变量,crontab 命令将使用缺省编辑器 ed。最好选择您熟悉的编辑器。
以下示例说明如何确定是否已定义编辑器,以及如何将 vi 设置为缺省值。
$ which $EDITOR $ $ EDITOR=vi $ export EDITOR |
创建 crontab 文件时,该文件会自动放入 /var/spool/cron/crontabs 目录,并以您的用户名命名。如果具有超级用户权限,则可为其他用户或 root 创建或编辑 crontab 文件。
如果要创建或编辑属于 root 或其他用户的 crontab 文件,您必须成为超级用户或同等角色。角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
无需成为超级用户,便可编辑自己的 crontab 文件。
创建新的 crontab 文件,或编辑现有文件。
$ crontab -e [username] |
其中,username 指定您要为其创建或编辑 crontab 文件的用户帐户的名称。无需具有超级用户权限便可创建自己的 crontab 文件,但如果要为 root 或其他用户创建或编辑 crontab 文件,则必须具有超级用户权限。
如果意外键入了不带选项的 crontab 命令,请按下编辑器的中断字符。使用此字符将退出而不会保存更改。如果保存了更改并退出文件,现有的 crontab 文件将被空文件覆写。
向 crontab 文件中添加命令行。
按照crontab 文件项的语法中所述的语法操作。将 crontab 文件放入 /var/spool/cron/crontabs 目录。
验证 crontab 文件更改。
# crontab -l [username] |
以下示例说明如何为其他用户创建 crontab 文件。
# crontab -e jones |
添加到新 crontab 文件中的以下命令项将在每个星期日的凌晨 1:00 自动删除用户起始目录中的所有日志文件。由于该命令项不重定向输出,因此将重定向字符添加到 *.log 之后的命令行中。这样可以确保正常执行命令。
# This command helps clean up user accounts. 1 0 * * 0 rm /home/jones/*.log > /dev/null 2>&1 |
要验证用户的 crontab 文件是否存在,请在 /var/spool/cron/crontabs 目录中使用 ls -l 命令。例如,以下输出说明用户 jones 和 smith 的 crontab 文件存在。
$ ls -l /var/spool/cron/crontabs -rw-r--r-- 1 root sys 190 Feb 26 16:23 adm -rw------- 1 root staff 225 Mar 1 9:19 jones -rw-r--r-- 1 root root 1063 Feb 26 16:23 lp -rw-r--r-- 1 root sys 441 Feb 26 16:25 root -rw------- 1 root staff 60 Mar 1 9:15 smith -rw-r--r-- 1 root sys 308 Feb 26 16:23 sys |
使用 crontab -l 命令验证用户的 crontab 文件的内容,如如何显示 crontab 文件中所述。
crontab -l 命令显示 crontab 文件内容的方式与 cat 命令显示其他类型文件内容的方式非常相似。无需转到 /var/spool/cron/crontabs 目录(crontab 文件所在的目录),便可使用此命令。
缺省情况下,crontab -l 命令显示您自己的 crontab 文件。要显示属于其他用户的 crontab 文件,您必须是超级用户。
成为超级用户或同等角色,以显示属于 root 或其他用户的 crontab 文件。
无需成为超级用户或同等角色,即可显示您自己的 crontab 文件。
显示 crontab 文件。
$ crontab -l [username] |
其中,username 指定了要为其显示 crontab 文件的用户帐户的名称。显示其他用户的 crontab 文件需要超级用户权限。
如果意外键入了无选项的 crontab 命令,请按下编辑器的中断字符。使用此字符将退出而不会保存更改。如果保存了更改并退出文件,现有的 crontab 文件将被空文件覆写。
此示例说明如何使用 crontab -l 命令来显示用户的缺省 crontab 文件的内容。
$ crontab -l 13 13 * * * chmod g+w /home1/documents/*.book > /dev/null 2>&1 |
此示例说明如何显示缺省的 root crontab 文件。
$ suPassword: Sun Microsystems Inc. SunOS 5.10 s10_51 May 2004 # crontab -l #ident "@(#)root 1.19 98/07/06 SMI" /* SVr4.0 1.1.3.1 */ # # The root crontab should be used to perform accounting data collection. # # 10 3 * * * /usr/sbin/logadm 15 3 * * 0 /usr/lib/fs/nfs/nfsfind 30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean #10 3 * * * /usr/lib/krb5/kprop_script ___slave_kdcs___ |
此示例说明如何显示属于其他用户的 crontab 文件。
$ su Password: Sun Microsystems Inc. SunOS 5.10 s10_51 May 2004 # crontab -l jones 13 13 * * * cp /home/jones/work_files /usr/backup/. > /dev/null 2>&1 |
缺省情况下,会设置 crontab 文件保护,以防止使用 rm 命令意外删除 crontab 文件。请改用 crontab -r 命令删除 crontab 文件。
缺省情况下,crontab -r 命令会删除您自己的 crontab 文件。
无需转到 /var/spool/cron/crontabs 目录(crontab 文件所在的目录),便可使用此命令。
成为超级用户或同等角色,以删除属于 root 或其他用户的 crontab 文件。角色包含授权和具有一定权限的命令。
无需成为超级用户或同等角色,即可删除您自己的 crontab 文件。
删除 crontab 文件。
$ crontab -r [username] |
其中 username 指定要为其删除 crontab 文件的用户帐户的名称。为其他用户删除 crontab 文件需要超级用户权限。
如果意外键入了无选项的 crontab 命令,请按下编辑器的中断字符。使用此字符将退出而不会保存更改。如果保存了更改并退出文件,现有的 crontab 文件将被空文件覆写。
验证是否已删除 crontab 文件。
# ls /var/spool/cron/crontabs |
以下示例说明用户 smith 如何使用 crontab -r 命令删除他的 crontab 文件。
$ ls /var/spool/cron/crontabs adm jones lp root smith sys uucp $ crontab -r $ ls /var/spool/cron/crontabs adm jones lp root sys uucp |
可以使用 /etc/cron.d 目录中的以下两个文件来控制对 crontab 命令的访问:cron.deny 和 cron.allow。这些文件只允许指定的用户执行 crontab 命令任务,例如创建、编辑、显示或删除自己的 crontab 文件。
cron.deny 和 cron.allow 文件包含用户名的列表,每行一个用户名。
这些访问控制文件按以下方式协同工作:
如果不存在 cron.allow,则所有用户都可以提交 crontab 文件(cron.deny 中列出的用户除外)。
如果 cron.allow 和 cron.deny 都不存在,则运行 crontab 命令需要超级用户权限。
编辑或创建 cron.deny 和 cron.allow 文件需要超级用户权限。
在 SunOS 软件安装期间创建的 cron.deny 文件包含以下用户名:
$ cat /etc/cron.d/cron.deny daemon bin smtp nuucp listen nobody noaccess |
缺省 cron.deny 文件中的用户名都不能访问 crontab 命令。您可以编辑此文件,以添加被拒绝访问 crontab 命令的其他用户名。
未提供缺省的 cron.allow 文件。因此,在安装 Oracle Solaris 软件后,所有用户(缺省 cron.deny 文件中列出的用户除外)都可以访问 crontab 命令。如果创建 cron.allow 文件,则只有这些用户可以访问 crontab 命令。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
编辑 /etc/cron.d/cron.deny 文件并添加用户名,每个用户占据一行。将拒绝访问 crontab 命令的用户包括在内。
daemon bin smtp nuucp listen nobody noaccess username1 username2 username3 . . . |
验证 /etc/cron.d/cron.deny 文件是否包含新项。
# cat /etc/cron.d/cron.deny daemon bin nuucp listen nobody noaccess |
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
创建 /etc/cron.d/cron.allow 文件。
将 root 用户名添加到 cron.allow 文件中。
如果未将 root 添加到该文件中,则会拒绝超级用户访问 crontab 命令。
添加用户名,每行一个用户名。
将允许使用 crontab 命令的用户包括在内。
root username1 username2 username3 . . . |
以下示例显示一个 cron.deny 文件,该文件用于禁止用户名 jones、temp 和 visitor 访问 crontab 命令。
$ cat /etc/cron.d/cron.deny daemon bin smtp nuucp listen nobody noaccess jones temp visitor |
以下示例显示一个 cron.allow 文件。用户 root、jones、lp 和 smith 是仅有的可以访问 crontab 命令的用户。
$ cat /etc/cron.d/cron.allow root jones lp smith |
要验证特定用户是否可以访问 crontab 命令,请在使用该用户帐户登录后执行 crontab -l 命令。
$ crontab -l |
如果用户可以访问 crontab 命令并已创建 crontab 文件,则会显示该文件。否则,如果用户可以访问 crontab 命令但不存在 crontab 文件,则会显示与以下消息类似的消息:
crontab: can't open your crontab file |
此用户已列在 cron.allow 文件中(如果存在该文件),或者该用户未列在 cron.deny 文件中。
如果用户不能访问 crontab 命令,则无论是否存在以前的 crontab 文件,都会显示以下消息:
crontab: you are not authorized to use cron. Sorry. |
此消息表明,该用户未列在 cron.allow 文件(如果该文件存在)中,或者该用户已列在 cron.deny 文件中。
调度作业(命令和脚本)以供以后执行
如何显示和删除这些作业
如何控制对 at 命令的访问
缺省情况下,用户可以创建、显示和删除自己的 at 作业文件。要访问属于 root 或其他用户的 at 文件,您必须具有超级用户权限。
提交 at 作业时,会为该作业分配作业标识号和 .a 扩展名。此指定将成为该作业的文件名,以及其队列编号。
调用 at 实用程序并指定命令执行时间。
键入以后要执行的命令或脚本。
如果此命令或脚本的输出很重要,请确保将输出定向到一个文件中,以便以后检查。
例如,以下 at 作业将在 7 月的最后一天接近午夜时删除用户帐户 smith 的 core 文件。
$ at 11:45pm July 31 at> rm /home/smith/*core* at> Press Control-d commands will be executed using /bin/csh job 933486300.a at Tue Jul 31 23:45:00 2004 |
您可以设置一个文件来控制对 at 命令的访问,只允许指定的用户创建、删除或显示有关 at 作业的队列信息。控制对 at 命令的访问的文件 /etc/cron.d/at.deny 由用户名列表构成,每个用户名占据一行。此文件中列出的用户不能访问 at 命令。
在 SunOS 软件安装期间创建的 at.deny 文件包含以下用户名:
daemon bin smtp nuucp listen nobody noaccess |
使用超级用户权限,您可以编辑 at.deny 文件,以添加要限制其对 at 命令访问的其他用户名。
$ at [-m] time [date] |
在作业完成后发送邮件。
指定要调度作业的小时。如果不按 24 小时制指定小时,请添加 am 或 pm。可接受的关键字包括 midnight、noon 和 now。分钟是可选的选项。
指定月份的前三个或更多字母、一周中的某日或关键字 today 或 tomorrow。
在 at 提示符下,键入要执行的命令或脚本,每行一个。
通过在每行结尾处按回车键,可以键入多个命令。
按 Ctrl-D 组合键,以退出 at 实用程序并保存 at 作业。
at 作业将被分配一个队列编号,它也是该作业的文件名。退出 at 实用程序时将显示该编号。
以下示例显示了用户 jones 创建的 at 作业,该作业用于在下午 7:30 删除其备份文件。由于她使用了 -m 选项,因此她会在该作业完成后收到电子邮件。
$ at -m 1930 at> rm /home/jones/*.backup at> Press Control-D job 897355800.a at Thu Jul 12 19:30:00 2004 |
她收到一封确认已执行 at 作业的电子邮件。
Your “at” job “rm /home/jones/*.backup” completed. |
以下示例说明 jones 如何调度在星期六凌晨 4:00 执行的大型 at 作业。该作业输出被定向到名为 big.file 的文件中。
$ at 4 am Saturday at> sort -r /usr/dict/words > /export/home/jones/big.file |
要验证您是否已创建了 at 作业,请使用 atq 命令。在以下示例中,atq 命令确认已将属于 jones 的 at 作业提交至队列。
$ atq Rank Execution Date Owner Job Queue Job Name 1st Jul 12, 2004 19:30 jones 897355800.a a stdin 2nd Jul 14, 2004 23:45 jones 897543900.a a stdin 3rd Jul 17, 2004 04:00 jones 897732000.a a stdin |
以下示例显示 at -l 命令的输出,该输出提供有关用户已提交的所有作业的状态信息。
$ at -l 897543900.a Sat Jul 14 23:45:00 2004 897355800.a Thu Jul 12 19:30:00 2004 897732000.a Tue Jul 17 04:00:00 2004 |
以下示例显示使用 at -l 命令指定单个作业时所显示的输出。
$ at -l 897732000.a 897732000.a Tue Jul 17 04:00:00 2004 |
成为超级用户或同等角色,以删除属于 root 或其他用户的 at 作业。角色包含授权和具有一定权限的命令。
无需成为超级用户或同等角色,便可删除自己的 at 作业。
在作业执行之前从队列中删除 at 作业。
$ at -r [job-id] |
其中,-r job-id 选项指定要删除的作业的标识号。
使用 at -l(或 atq)命令,验证是否已删除 at 作业。
at -l 命令显示 at 队列中剩余的作业。不应显示已指定标识号的作业。
$ at -l [job-id] |
在以下示例中,用户要删除计划在 7 月 17 日凌晨 4 点执行的 at 作业。首先,该用户显示 at 队列,以找到作业标识号。然后,用户从 at 队列中删除此作业。最后,该用户验证是否已从队列中删除此作业。
$ at -l 897543900.a Sat Jul 14 23:45:00 2003 897355800.a Thu Jul 12 19:30:00 2003 897732000.a Tue Jul 17 04:00:00 2003 $ at -r 897732000.a $ at -l 897732000.a at: 858142000.a: No such file or directory |
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
编辑 /etc/cron.d/at.deny 文件并添加要禁止其使用 at 命令的用户名,每行一个用户名。
daemon bin smtp nuucp listen nobody noaccess username1 username2 username3 . . . |
以下示例显示了一个 at.deny 文件,该文件已被编辑过,因此用户 smith 和 jones 无法访问 at 命令。
$ cat at.deny daemon bin smtp nuucp listen nobody noaccess jones smith |
要验证是否已将用户名正确添加到 /etc/cron.d/at.deny 文件,请在以该用户身份登录后使用 at -l 命令。如果用户 smith 无法访问 at 命令,将显示以下消息:
# su smith Password: $ at -l at: you are not authorized to use at. Sorry. |
类似地,如果该用户尝试提交 at 作业,则将显示以下消息:
$ at 2:30pm at: you are not authorized to use at. Sorry. |
此消息确认该用户已列在 at.deny 文件中。
如果允许访问 at 命令,则 at -l 命令不会返回任何内容。