`
huangro
  • 浏览: 333607 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Linux 技巧: 用 cron 和 at 调度作业

阅读更多

转至:http://www.ibm.com/developerworks/cn/linux/l-job-scheduling.html

如何轻松地管理系统





</td></tr><tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" mce_src="http://www.ibm.com/i/c.gif" height="1" alt="" width="8" /></td><td width="16"><img src="//www.ibm.com/i/c.gif" mce_src="http://www.ibm.com/i/c.gif" height="16" alt="" width="16" /></td><td class="small" width="122"><p><span class="ast">未显示需要 JavaScript 的文档选项</span></p></td></tr>

<!-- START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!-- END RESERVED FOR FUTURE USE INCLUDE FILES-->

级别: 中级

Ian Shields , 高级程序员, IBM

2007 年 8 月 27 日

系统管理员需要在系统负载低的午夜运行作业,或者需要每天或每月运行作业,同时又不愿意牺牲睡眠时间或假期。调度任务的其他原因包括自动执行日常任务或者确保每次都以相同的方式处理任务。本文帮助您使用 cronat 功能调度作业定期运行或在指定的时间运行一次。
<!-- START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!-- END RESERVED FOR FUTURE USE INCLUDE FILES-->

Linux® 和 UNIX® 系统允许调度任务在以后执行一次,或者重复运行。本文是从 developerWorks 教程 “LPI 102 考试准备:管理任务 ” 摘录的,讲解如何调度作业定期运行,或在指定的时间运行一次。

在 Linux 系统上,许多管理任务必须频繁地定期执行。这些任务包括轮转日志文件以避免装满文件系统、备份数据和连接时间服务器来执行系统时间同步。上面提到的教程更详细地介绍了这些管理任务。在本文中,学习 Linux 中提供的调度机制,包括 cronanacron 设施以及 crontabat 命令。即使系统常常关机,anacron 也可以帮助调度作业。

以一定的时间间隔运行作业

以一定的时间间隔运行作业需要使用 cron 设施进行管理,它由 crond 守护进程和一组表(描述执行哪些操作和采用什么样的频率)组成。这个守护进程每分钟唤醒一次,并通过检查 crontab 判断需要做什么。用户使用 crontab 命令管理 crontab。crond 守护进程常常是在系统启动时由 init 进程启动的。

为了简单,假设希望定期运行清单 1 所示的命令。这个命令实际上只报告日期和时间,其他什么事都不做,但是它可以说明如何使用 crontab 设置 cron 作业,而且还可以通过输出看到作业运行的时间。设置 crontab 条目需要一个包含转义的 shell 元字符的字符串,所以适合于简单的命令和参数。在这个示例中,将从脚本 /home/ian/mycrontab.sh 运行 echo 命令,这个脚本不需要参数。 这可以减少处理转义字符的工作。


清单 1. 一个简单的命令示例

                
[ian@lyrebird ~]$ cat mycrontest.sh
#!/bin/bash
 echo "It is now $(date +%T) on $(date +%A)"
[ian@lyrebird ~]$ ./mycrontest.sh
It is now 18:37:42 on Friday

 

创建 crontab

使用 crontab 命令和 -e (表示 “edit”)选项创建 crontab。这会打开 vi 编辑器,除非在 EDITOR 或 VISUAL 环境变量中指定了另一种编辑器。

每个 crontab 条目包含六个字段:

  1. 分钟
  2. 小时
  3. 星期
  4. sh 执行的字符串

分钟和小时的范围分别是 0-59 和 0-12,日和月的范围分别是 1-31 和 1-12。星期的范围是 0-6,0 表示星期日。星期也可以指定为 sun、mon、tue 等等。第 6 个字段包含前 5 个字段之后的所有内容,它是要传递给 sh 的字符串。百分号(%)将转换为空行,所以如果要使用 % 或其他任何特殊字符,就要在前面加上反斜线(\)。第一个 % 之前的一行传递给 shell,这个 % 之后的所有行都作为标准输入传递。

各个与时间相关的字段可以指定一个单独的值、值的范围(比如 0-10 或 sun-wed)或者以逗号分隔的单独值和范围列表。清单 2 给出一个 crontab 条目示例。


清单 2. 一个简单的 crontab 示例

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

 

在这个示例中,我们的命令在 7 月的每个星期五和星期六晚上 10 点到午夜之间的第 0、20、40 分钟(每 20 分钟)执行。关于指定时间的其他方式的细节,参见 crontab(5) 的手册页。

输出

您可能想知道对来自命令的输出会如何处理。为使用 cron 而设计的大多数命令会使用 syslog 在日志中记录输出(参见教程 “LPI 102 考试准备:管理任务 ” 中的讨论)。但是,定向到 stdout 的输出会通过电子邮件发送给用户。清单 3 给出我们的命令示例可能产生的输出。


清单 3. 通过电子邮件发送的 cron 输出

                
From ian@lyrebird.raleigh.ibm.com  Fri Jul  6 23:00:02 2007
Date: Fri, 6 Jul 2007 23:00:01 -0400
From: root@lyrebird.raleigh.ibm.com (Cron Daemon)
To: ian@lyrebird.raleigh.ibm.com
Subject: Cron <ian@lyrebird> /home/ian/mycrontest.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/ian>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=ian>
X-Cron-Env: <USER=ian>

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 可以包含环境设置。每个作业有四个字段:

  1. 周期
  2. 延迟
  3. 作业标识符
  4. 命令

周 期是天数,但是可以指定为 @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 ian@lyrebird.raleigh.ibm.com  Sat Jul  7 10:25:00 2007
Date: Sat, 7 Jul 2007 10:25:00 -0400
From: Ian Shields <ian@lyrebird.raleigh.ibm.com>
Subject: Output from your job        5
To: ian@lyrebird.raleigh.ibm.com

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 值表示一个作业对于其他用户的优先程度。关于 nicerenice 命令的更多信息,参见教程 “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 设施起相似的作用。

 




回页首


了解更多信息

如果想了解关于 Linux 管理任务的更多信息,请阅读教程 “LPI 102 考试准备:管理任务 ”,或者参见下面的 参考资料 。不要忘记 rate 这个页面


参考资料

学习


获得产品和技术

  • 索取 SEK for Linux ,这套 DVD(两张)包含来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的最新 IBM 试用版 Linux 软件。

  • 使用 IBM 试用软件 构建您的下一个 Linux 开发项目,这些软件可以从 developerWorks 直接下载。


讨论


关于作者

Ian Shields

Ian Shields 为 developerWorks Linux 专区的许多 Linux 项目工作。他是 IBM 北卡罗莱那州 Research Triangle Park 的一名高级程序员。他于 1973 年作为一名系统工程师加入 IBM 位于澳大利亚堪培拉的子公司。之后,在加拿大蒙特利尔和北卡罗莱那州 RTP 从事通信系统和普及运算。他拥有多项专利并发表了若干篇论文。他毕业于 Australian National University,本科学位是纯数学和哲学。他拥有北卡罗来纳州立大学的计算机硕士和博士学位。

分享到:
评论

相关推荐

    操作系统Linux实验报告四:LINUX进程调度与系统监视.doc

    实验环境是 Redhat Linux,实验目的包括熟练掌握手工启动前后台作业的方法、熟练掌握进程与作业管理的相关 Shell 命令、掌握 at 调度和 cron 调度的设置方法,以及了解进行系统性能监视的基本方法。 在实验中,我们...

    linux 计划任务cron--怎么定时执行的指令

    Cron是Linux系统中用于调度周期性任务的守护进程(Daemon),允许用户在固定时间或周期性地执行命令或脚本。通过Cron,用户可以设定复杂的定时任务,如定期备份数据、清理日志、发送邮件提醒等。 #### 二、Cron的...

    Linux的调度命令1

    ### Linux的调度命令详解:at命令 #### 一、引言 在Linux系统管理中,自动化任务处理是一项非常重要的技能。其中一个常用的工具是`at`命令,它允许用户在特定的时间点执行预定的命令或者脚本。这不仅提高了效率,还...

    Linux at命令详解

    Linux中的`at`命令是一个非常实用的工具,它允许用户安排在特定时间执行一次性的任务。这个命令在系统管理、自动化脚本或者需要在...了解并熟练使用`at`命令,可以帮助Linux用户更有效地管理和调度任务,提高工作效率。

    Linux网络操作系统基础:一次性任务at.pptx

    * 使用 cron 作业调度器,例如 cron 08:00 send email,指定在某个特定的时间执行命令 at 命令的执行权限: * 对于 at 命令来说,需要定时执行的命令是从标准输入或者使用 – f 选项指定的文件中读取并执行的 * ...

    6-3Linux计划任务管理.pdf

    在Linux中,主要使用两个工具来管理计划任务:`cron`和`at`。`cron`是Linux下的周期性任务调度器,用于设置定期执行的任务。`at`则用于一次性任务的调度,即在指定的未来时间执行一次任务。 1. **cron服务** - **...

    at&cron.pdf

    ### Linux计划任务详解:at与cron #### 一、引言 在Linux系统中,计划任务是一项非常重要的功能,它允许用户安排系统自动执行特定任务,例如定时备份...希望本文能帮助读者更好地理解和掌握Linux计划任务的使用技巧。

    vixie-cron-4.1.rar

    Vixie-cron可以与at、anacron等其他调度工具配合使用,提供更丰富的定时任务解决方案。例如,anacron用于处理那些不经常启动的系统,而at则适用于一次性任务。 总结,Vixie-cron 4.1作为Linux下的一款强大定时任务...

    计算机病毒与防护:Linux任务调度.pptx

    计算机病毒与防护是IT领域的重要话题,特别是在Linux操作系统中,因为Linux系统因其开源和安全性而被广泛使用。然而,任何操作系统都有潜在的安全风险,其中包括病毒的威胁。在Linux环境中,任务调度是系统管理的...

    计划任务Cron表达式生成

    "Cron"这个词来源于北欧神话中的时间之神"Cronus",在Unix/Linux系统中,`cron`守护进程负责调度和执行由Cron表达式定义的任务。Cron表达式是由6或7个由空格分隔的字段组成的字符串,每个字段代表不同的时间单位,从...

    Linux使用Cron+AT实现在某个确定的时间段内随机执行命令

    Cron和AT是两种广泛使用的定时任务工具,它们分别具有不同的特点和使用场景。本文将探讨如何结合Cron和AT来实现在一个确定的时间段内随机执行命令,以满足特定的需求,如避免在数据库中产生过于规律的记录。 首先,...

    《Linux操作系统》实验六-LinuxUNIX作业、任务和进程管理.pdf

    《Linux操作系统》实验六主要关注的是Linux和UNIX系统下的作业、任务和进程管理。这个实验旨在让学生熟悉并掌握操作系统中的核心概念,包括进程的查看、控制、终止以及进程间的通信。以下是实验涉及的关键知识点: ...

    前端开源库-node-cron

    `node-cron` 是一个专为Node.js设计的轻量级任务调度库,它允许开发者在服务器端设置类似于Linux `cron` 的定时任务。这个库使得开发者能够方便地在JavaScript环境中创建周期性的作业,比如定时发送邮件、清理日志、...

    实验5:作业任务和进程管理.docx

    实验5主要涵盖了Linux/UNIX系统中的作业、任务和进程管理,包括了进程的状态查询、终止、挂起、前后台调度,以及系统进程间通信机制,特别是信号操作和进程的定时启动管理。下面是这些知识点的详细解释: **1. 进程...

    例行性工作调度-15th1

    总结来说,Linux 的例行性工作调度涉及 `cron` 和 `at` 两个主要组件,它们分别处理周期性和一次性任务。通过适当的配置和权限控制,管理员可以确保系统的自动化任务按照预期执行,同时保持系统的安全性和稳定性。

    Linux文版-实验8-进程管理-学生实验报告模板-p.doc

    本实验报告主要探讨了Linux操作系统中的进程管理,包括手动启动前后台作业、使用相关的shell命令管理进程和作业、配置at和cron调度,以及系统性能的监视。实验旨在让学生掌握Linux环境中进程控制和系统监控的关键...

    linux计划任务和自动登录.doc

    在Linux系统管理中,计划任务和自动登录是两种重要的自动化工具...总之,Linux的at、cron和anacron提供了强大的计划任务功能,满足了系统管理员的各种自动化需求。理解并熟练使用这些工具是Linux系统管理中的重要技能。

    linux进程管理pdf文件

    系统可以根据预定的时间表自动启动指定的程序,常用的调度工具包括`at`、`batch`和`cron`: - **at**:用于安排一次性运行的任务。 - **batch**:用于调度批处理任务,在系统负载较低时运行。 - **cron**:用于定期...

    linux复习资料 期末考试

    偶尔运行的进程采用:at 或 batch 调度 特定时间重复运行的进程采用:cron 调度。 8. mkfs: 在文件上创建文件系统,也就是进行磁盘格式化,创建的是:lost+found 目录。 9. 终止进程: ctrl+c q%+作业号 q+进程号...

Global site tag (gtag.js) - Google Analytics