2007-01-02

定时执行工作

在 FreeBSD 系统中,系统常常会定时执行一行工作,例如,每天的系统信息统计、系统安全检查等。而系统管理者及一般使用者也可以设定定时执行一些工作,这些工作可以时只执行一次、或是定时重复执行。

如 果是要设定只执行一次的工作,例如,设定在今天 10:00 时执行某个指令,我们可以使用「at」这个指令。如果是要设定重复报行的工作,例如,设定每天 12 点执行某个指令,我们可以使用「crontab」这个指令,或者是由系统管理者编辑 /etc/crontab 这个档案来进行设定。我们先来看看「crontab」重复定时执行程序的说明:

「crontab」重复定时执行程序

在 UNIX 系统中,有一个背景程序会定时执行一些工作,这个程序在 FreeBSD 中称为「cron」。「cron」这个程序会定时去检查 /etc/crontab 及 /var/cron/tabs 中的档案,并执行其中的设定。/etc/crontab 可以让管理者设定要以什么使用者的身份去执行定时工作,而一般使用者如果要设定定时执行工作时,可以使用指令 crontab -e 来编辑自己的定时执行工作,crontab 会将使用者的工作设定放在 /var/cron/tabs 中。

我们先来看一下 /etc/crontab 的内容说明:

# 设定使用的 shell, 路径
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# 设定执行指令时的目录
HOME=/var/log
# 当指令有输出数据时,要将输出的东西寄给谁。
MAILTO=""
#
# 分 小时 天 月 星期几 身份 指令
#minute hour mday month wday who command
#
*/5 * * * * root /usr/libexec/atrun

minute:代表一小时内的第几分,范围 0-59。
hour:代表一天中的第几小时,范围 0-23。
mday:代表一个月中的第几天,范围 1-31。
month:代表一年中第几个月,范围 1-12。
wday:代表星期几,范围 0-7 (0及7都是星期天)。
who:要使用什么身份执行该指令,当您使用 crontab -e 时,不必加此字段。
command:所要执行的指令。

小时的字段中如果是 *,表示每小时,天的字段中如果是 *,表示每天,依此类推。字段中也可以使用 "-" 来表示范围。例如,在小时的字段中填 8-11,表示执行的时间是 8,9,10,11,共四次。

字段中也可以用逗点来表示,以分的字段而言, 1,2,5,9 表示将在 1,2,5,9 分时各执行一次。我们也可以写成像这样 1-2,12-14 ,表示在 1,2,12,13,14 分各执行一次。

另外,也可以用 / 后面加数字表示每几分钟要执行一次。如在分的字段填 0-23/2,表示 1-22 分之间,每隔二分钟执行一次,也就是 0,2,4,6,8,10,12,14,16,18,20,22。如果在分的字段是 */5,表示每五分钟一次。

除此之外,在时间的字段中,我们也可以用一个开头为 @ 的字符串来表示各种排程时间意义:
字符串 代表意义
@reboot 开机时跑一次。
@yearly 每年跑一次,等于 "0 0 1 1 *"。
@annually 和 @yearly 一样。
@monthly 每月跑一次,等于 "0 0 1 * *",也就是每月一日半夜 12 点执行。
@weekly 每周跑一次,等于 "0 0 * * 0",也就是每个周日半夜 12 点执行。
@daily 每天跑一次,等于 "0 0 * * *",也就是每天半夜 12 点执行。
@midnight 和 @daily 一样。
@hourly 每小时跑一次,等于 "0 * * * *"。


另外,我们还可以在档案中以「key = value」的方式设定在执行指令时的环境变量。例如,一般指令有输出执行结果时,会自动寄给 root,我们也可以设定「MAILTO = ""」表示不要将输出结果寄出。

以下为几个时间设定的范例:
# 分 小时 天 月 星期几 身份 指令
#minute hour mday month wday who command
#
# 设定每 5 分钟执行一次atrun。
*/5 * * * * root /usr/libexec/atrun

# 设定每天一点零一分时执行 /bin/check
1 1 * * * root /bin/check

# 设定每周一 3:11 分执行 week_check
11 3 * * 1 root /usr/local/week_check

# 设定每天一点及四点的零到二十三分中间,每二分钟执行一次 something。
0-23/2 1,4 * * root /bin/something

# 设定每天半夜十二点执行 something。
@daily root /bin/something

如 果你以一般使用者或是管理者的身份执行 crontab -e 来设定 crontab,你不必设定身份的字段,因为 crontab 会自动取得您的身份。使用 crontab -e 所设定的工作会被放在 /var/cron/tabs 目录中,所以如果要备份或升级时,应该要注意这些档案是否要备份。

「at」设定只执行一次的程序

cron 可以用来设定不断的重复定时执行一些工作,然而,如果您只希望在某个时间执行「一次」某个指令,可以使用「at」。

「at」 的设定可以分为三个指令:「at」用来建立工作、「atq」用来列出目前待执行的工作有哪些、「atrm」用来删除 atq 中所列出的工作。当您执行了 at 后,它会要求您在命令列中以 shell scripts 的写法输入想要执行的指令,而您也可以先将所要执行的指令写再一个档案中,再让 at 去执行。

在使用 at 指令时,必须先输入您要在什么时候执行工作,而时间的格式可以是下列任何一种:
格式 说明
at 10pm 设定晚上十点执行。时间的格式可以是 HHMM 或 HH:MM。
at 8:30am Oct 10 设定十月十日早上八点半执行。
at midnight Jan 1 2005 设定 2005 年一月一日的第一秒钟执行。
at teatime 设定在下次的下午 4 点执行。teatime 表示是 4:00pm,而 midnight 表示半夜十二点,noon 表示中午十二点。
at -t MMDDhhmm 表示在 MM 月 DD 日 hh 时 mm 分时执行,您还可以在 MM 前加上年,而年的格式二位或是四位都可以。


如 果您要设定在 10pm 执行某些工作,您可以打「at 10pm」后按 ,接着您必须开始输入所要执行的指令,在全部输入完成后,请按 +结束编辑。如果您不想使用命令列编辑的方式输入所要执行的工作,您可以先写一个 shell script 并使用下列指令设定:

# at -f mycommand.sh 10pm
上述指令中,您所写的 shell scripts 档案是 mycommand.sh。

在设定之后,接着您可以使用下列指令列出目前等待执行的 at 工作:

# atq
Date Owner Queue Job#
2005年 6月 5日 周日 22时00分00秒 CST root c 2

如果您要删除某一个工作,只要使用 atrm 并输入该工作在 atq 中的 job id 即可。例如,我们要删除 ID 为 2 的工作:

# atrm 2
限制一般使用者使用 cron 及 at

大部份的情况下,一般使用者应该不会需要使用定时排程的工作。如果您发现有使用者定时会执行一些耗费系统数据的工作,我们可以为这个指令设限,只允许必要的使用者执行。

如 果要限制使用 crontab,只需要在 /var/cron 目录中,加入 allow 或是 deny 这个档即可。例如,我们只允许少数几个使用者执行 crontab,我们可以新增 /var/cron/allow 这个档,内容为该使用者的名称。相对的,如果我们要限制少数几个使用者执行 crontab,只要编辑 /var/cron/deny 这个档即可。而指令 at 的限制也是一样,不同的只是允许执行 at 指令的名单是 /var/at/at.allow,而拒绝的名单是 /var/at/at.deny。

0 评论:

发表评论