在linux中at 调度出错,Linux 技巧: 用cron 和at 调度作业

X-Cron-Env: It is now 23:00:01 on Friday

crontab 存储在哪里?

suid 程序

suid 程序以程序文件的所有者的权限运行,而不是采用运行程序的用户的权限。关于 suid 的更多信息,参见教程 “LPI 101

考试准备:设备、Linux 文件系统和 Filesystem Hierarchy Standard”;关于 passwd

命令的更多信息,参见教程 “LPI 102 考试准备:管理任务”。

用 crontab 命令创建的 crontab 存储在 /etc/spool/cron 下面的一个子目录中,这个子目录与创建 crontab

的用户同名,所以上面的 crontab 存储在 /etc/spool/cron/ian 中。因此,与 passwd 命令一样,crontab

命令是一个用根权限运行的 suid 程序。

/etc/crontab

除了 /var/spool/cron 中的用户 crontab 文件之外,cron 还会检查 /etc/crontab 文件和

/etc/cron.d 目录中的文件。在这些系统 crontab

中,在第五个时间字段(星期)和命令之间增加了一个字段。这个字段指定哪个用户应该运行这个命令,一般情况下是根用户。清单 4 给出一个

/etc/crontab 文件示例。

清单 4. /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

# run-parts

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

在这个示例中,真正的工作由 run-parts 命令执行,它运行 /etc/cron.hourly、/etc/cron.daily

等目录中的脚本;/etc/crontab 仅仅控制执行作业的时间。注意,这里的所有命令都作为根用户运行。还要注意,crontab 可以包含

shell 变量赋值,这些赋值会在运行命令之前执行。

anacron

cron 适合那些连续运行的系统。对于那些常常不开机的系统,比如笔记本计算机,可以使用另一个实用程序 anacron(表示 “anachronistic cron”)调度每日、每周或?**葱械淖饕怠?anacron 不处理每小时执行的作业。

anacron 在 /var/spool/anacron 中保留时间戳文件,记录作业运行的时间。当 anacron

运行时,它检查自作业上一次运行以来是否已经经过了所需的天数,如果需要,就运行作业。anacron 的作业表存储在

/etc/anacrontab 中,文件格式与 /etc/crontab 略有不同。与 /etc/crontab

一样,/etc/anacrontab 可以包含环境设置。每个作业有四个字段:

周期

延迟

作业标识符

命令

周期是天数,但是可以指定为

@monthly,这确保作业每?**辉诵幸淮危ㄎ蘼壅飧**杏卸嗌偬欤?。延迟是在作业符合运行条件之后,到实际启动它之前等待的分钟数。可以使用这个

设置防止在系统启动时集中执行作业。作业标识符可以包含除了斜线(/)之外的所有非空白字符。

/etc/crontab 和 /etc/anacrontab 都通过直接编辑进行更新。不使用 crontab 命令更新这些文件或 /etc/cron.d 目录中的文件。

在指定的时间运行作业

有时候,需要只运行作业一次而不是定期运行。为此,应该使用 at 命令。要运行的命令是从 -f 选项指定的文件读取的,如果没有使用 -f,那么从

stdin 读取。-m 选项向用户发送邮件,即使命令没有 stdout。-v 选项显示运行作业的时间。这个时间也显示在输出中。

清单 5 给出一个运行 mycrontest.sh 脚本的示例。清单 6 显示在运行作业之后通过邮件发送给用户的输出。注意,这里的输出比对应的 cron 作业输出要简单一些。

清单 5. 使用 at 命令

[ian@lyrebird ~]$ at -f mycrontest.sh -v 10:25

Sat Jul  7 10:25:00 2007

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

清单 6. 来自 at 的作业输出

From   Sat Jul  7 10:25:00 2007

Date: Sat, 7 Jul 2007 10:25:00 -0400

From: Ian Shields <>

Subject: Output from your job        5

To:

It is now 10:25:00 on Saturday

时间的设置可以非常复杂。清单 7 给出几个示例。参见 at 的手册页、/usr/share/doc/at/timespec 文件或

/usr/share/doc/at-3.1.10/timespec 这样的文件(这个示例中的 3.1.10 是 at 包的版本号)。

清单 7. at 命令使用的时间值

[ian@lyrebird ~]$ at -f mycrontest.sh  10pm tomorrow

job 14 at Sun Jul  8 22:00:00 2007

[ian@lyrebird ~]$ at -f mycrontest.sh 2:00 tuesday

job 15 at Tue Jul 10 02:00:00 2007

[ian@lyrebird ~]$ at -f mycrontest.sh 2:00 july 11

job 16 at Wed Jul 11 02:00:00 2007

[ian@lyrebird ~]$ at -f mycrontest.sh 2:00 next week

job 17 at Sat Jul 14 02:00:00 2007

nice 值

nice 值表示一个作业对于其他用户的优先程度。关于 nice 和 renice 命令的更多信息,参见教程 “LPI 101 考试准备:GNU 和 UNIX 命令”。

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

管理调度的作业

列出调度的作业

可以管理 cron 和 at 作业。使用 crontab 命令和 -l 选项列出 crontab,使用 atq 命令显示用 at 命令加入队列中的作业,见清单 8。

清单 8. 显示调度的作业

[ian@lyrebird ~]$ crontab -l

0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh

[ian@lyrebird ~]$ atq

16      Wed Jul 11 02:00:00 2007 a ian

17      Sat Jul 14 02:00:00 2007 a ian

14      Sun Jul  8 22:00:00 2007 a ian

15      Tue Jul 10 02:00:00 2007 a ian

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

清单 9. 使用 at -c 并加上作业号

#!/bin/sh

# atrun uid=500 gid=500

# mail ian 0

umask 2

HOSTNAME=lyrebird.raleigh.ibm.com; export HOSTNAME

SHELL=/bin/bash; export SHELL

HISTSIZE=1000; export HISTSIZE

SSH_CLIENT=9.67.219.151 3210 22; export SSH_CLIENT

SSH_TTY=/dev/pts/5; export SSH_TTY

USER=ian; export USER

...

HOME=/home/ian; export HOME

LOGNAME=ian; export LOGNAME

...

cd /home/ian || {

echo 'Execution directory inaccessible' >&2

exit 1

}

${SHELL:-/bin/sh} << `(dd if=/dev/urandom count=200 bs=1

2>/dev/null|LC_ALL=C tr -d -c '[:alnum:]')`

#!/bin/bash

echo "It is now $(date +%T) on $(date +%A)"

注意,我们脚本文件的内容已经复制在一个 here-document 中,这个 here-document 将由 SHELL 变量指定的

shell 执行(如果没有设置 SHELL 变量,就使用 /bin/sh)。关于 here-document 的信息参见教程 “LPI 101

考试准备,主题 103:GNU 和 UNIX 命令”。

删除调度的作业

可以使用 cron 命令和 -r 选项删除所有调度的 cron 作业,见清单 10。

清单 10. 显示并删除 cron 作业

[ian@lyrebird ~]$ crontab -l

0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh

[ian@lyrebird ~]$ crontab -r

[ian@lyrebird ~]$ crontab -l

no crontab for ian

要删除系统 cron 或 anacron 作业,应该编辑 /etc/crontab、/etc/anacrontab 或者编辑或删除 /etc/cron.d 目录中的文件。

可以使用 atrm 命令加作业号删除用 at 命令调度的一个或多个作业。多个作业应该用空白分隔。清单 11 给出一个示例。

清单 11. 用 atq 和 atrm 显示并删除作业

[ian@lyrebird ~]$ atq

16      Wed Jul 11 02:00:00 2007 a ian

17      Sat Jul 14 02:00:00 2007 a ian

14      Sun Jul  8 22:00:00 2007 a ian

15      Tue Jul 10 02:00:00 2007 a ian

[ian@lyrebird ~]$ atrm 16 14 15

[ian@lyrebird ~]$ atq

17      Sat Jul 14 02:00:00 2007 a ian

配置用户对作业调度的访问

如果文件 /etc/cron.allow 存在,那么非根用户必须在其中列出,才能使用 crontab 和 cron 设施。如果

/etc/cron.allow 不存在,但是 /etc/cron.deny 存在,那么其中列出的非根用户不能使用 crontab 或 cron

设施。如果这两个文件都不存在,那么只允许超级用户使用这个命令。空的 /etc/cron.deny 文件允许所有用户使用 cron

设施,这是默认情况。

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

原文链接:http://www.ibm.com/developerworks/cn/linux/l-job-scheduling.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值