Linux的定时任务

我确信,当你开始使用脚本时,你会想要在预设的时间运行脚本,通常是在你不在的时候。Linux系统提供了几种在预选时间运行脚本的方法:at命令和cron表。每种方法都使用不同的技术来调度运行脚本的时间和频率。以下部分描述了这些方法。

使用at命令安排作业

at命令允许您指定Linux系统运行脚本的时间。at命令将作业提交到队列,并在shell上运行作业时指示。at守护程序atd在后台运行,并检查作业队列中是否有要运行的作业。大多数Linux发行版在引导时自动启动此守护程序。

atd守护程序检查系统上的特殊目录(通常是/ var / spool / at),以查找使用at命令提交的作业。默认情况下,atd守护程序每60秒检查一次此目录。当作业存在时,atd守护程序会检查作业设置为运行的时间。如果时间与当前时间匹配,则atd守护程序将运行该作业。

以下部分描述如何使用at命令提交要运行的作业以及如何管理作业。

at命令格式

基本的命令格式非常简单:

[ -f filename ]  时间

默认情况下,at命令将STDIN的输入提交给队列。您可以使用-f参数指定用于读取命令(脚本文件)的文件名。

time参数指定您希望Linux系统何时运行作业。您可以通过指定时间来获得相当的创意。at命令可识别许多不同的时间格式:

  • 标准时间和分钟,例如10:15
  • ~AM /〜PM指示符,例如10:15〜PM
  • 特定的指定时间,例如现在,中午,午夜或下午茶时间(4〜PM)

如果指定已经过去的时间,则at命令会在第二天运行该作业。

除了指定运行作业的时间外,您还可以使用几种不同的日期格式包含特定日期:

  • 标准日期格式,例如MMDDYY,MM / DD / YY或DD.MM.YY
  • 文本日期,例如7月4日或12月25日,有或没有年份
  • 您还可以指定时间增量:
    • 现在+ 25分钟
    • 明天10:15〜PM
    • 10:15 + 7天

使用at命令时,作业将提交到作业队列中。作业队列保存at命令提交的作业以进行处理。有26种不同的作业队列可用于不同的优先级。使用小写字母a到z引用作业队列。

作业队列按字母顺序排列越高,作业运行的优先级(更高的漂亮值)越低。默认情况下,作业将提交到at作业队列。如果要以更高的优先级运行作业,可以使用-q参数指定其他队列号。

检索作业输出

当作业在Linux系统上运行时,没有与该作业关联的监视器。相反,Linux系统使用提交作业的用户的电子邮件地址作为STDOUT和STDERR。任何发往STDOUT或STDERR的输出都将通过邮件系统邮寄给用户。

以下是使用at命令安排作业运行的简单示例:

$
$ cat test5
#!/斌/庆典

#在命令测试


echo此脚本在'date'
 回显运行这是脚本>  2 的结尾
$
$ date2010年
10月18日星期一14:38:17
$
$ at -f test5 14:39
警告:将使用/ bin / sh执行命令
工作57在2010年10月18日星期一14:39:00
$
$ mail
“/ var / mail / user”:1条消息1新
> N    1用户Mon Oct 18 14:39 15/538你的工作输出
  1
日期:星期一,2010  10 18  14:39:00 -0400
主题:你工作的输出57
收件人:user @ user-desktop
来自:user <user @ user-desktop>

该剧本于2010年10月18日星期一14:39:00开始
这是脚本的结尾

 退出
$ 

at命令生成一条警告消息,指示系统使用哪个shell来运行脚本/ bin / sh,以及分配给作业的作业编号以及计划运行作业的时间。

作业完成后,显示器上不显示任何内容,但系统会生成电子邮件。电子邮件消息显示脚本生成的输出。如果脚本没有产生任何输出,默认情况下它不会生成电子邮件。您可以使用at命令中的-m选项更改它。这会生成一封电子邮件,指示作业已完成,即使脚本未生成任何输出。

列出待处理的工作

atq命令允许您查看系统上待处理的作业:

$
$ at -f test5 15:05
警告:将使用/ bin / sh执行命令
工作58在2010年10月18日星期一15:05:00
$
$ at -f test5 15:10
警告:将使用/ bin / sh执行命令
工作59在2010年10月18日星期一15:10:00
$
$ at -f test5 15:15
警告:将使用/ bin / sh执行命令2010年10月18日星期一15:15:00 
工作60
$
$ at -f test5 15:20
警告:将使用/ bin / sh执行命令
工作61在星期一10月18日 15:20:00 2010
 $$ atq
 61      星期一10月18日 15:20:00 2010用户
 58      星期一10月18日 15:05:00 2010用户
 59      星期一10月18日 15:10:00 2010 a用户
 60      星期一10月18日 15:15:00 2010用户
$ 

作业列表显示作业编号,系统将运行作业的日期和时间以及作业存储在其中的作业队列。

删除工作

一旦知道有关作业队列中待处理作业的信息,就可以使用atrm命令删除待处理作业:

$
$ atq
59 2010年      10月18 星期一15:10:00 用户
 60 2010年      10月18日 15:15:00 用户
$
$ atrm 59
$
$ atq
60      周一年10月18 15:15:00 2010用户
$ 

只需指定要删除的作业编号即可。您只能删除提交执行的作业。您无法删除他人提交的职位。

调度常规脚本

使用at命令安排脚本在预设时间运行是很好的,但如果您需要该脚本每天或每周一次或每月一次运行,该怎么办?您可以使用Linux系统的另一个功能,而不必持续提交作业。

Linux系统使用cron程序允许您安排需要定期运行的作业。cron程序在后台运行,并为计划运行的作业检查称为cron表的特殊表。

cron表

cron表使用特殊格式允许您指定何时应运行作业。cron表的格式是:

最小时数dayofmonth month dayofweek 命令

cron表允许您将条目指定为特定值,值范围(例如1-5)或通配符(星号)。例如,如果要在每天10:15运行命令,则可以使用以下cron表条目:

15  10 * * * 命令

dayofmonth,month和dayofweek字段中使用的通配符表示cron将在每个月的每个月的10:15执行命令。要指定每周一下午4:15运行的命令,您将使用以下命令:

15  16 * * 1  命令

您可以将dayofweek条目指定为三个字符的文本值(mon,tue,wed,thu,fri,sat,sun)或数字值,0表示星期日,6表示星期六。

这是另一个例子:在每个月的第一天中午12点执行一个命令,你将使用以下格式:

00  12  1 * * 命令

dayofmonth条目指定月份的日期值(1-31)。

命令列表必须指定要运行的命令或shell脚本的完整路径名。您可以添加任何命令行参数或重定向符号作为常规命令行:

15  10 * * * / home / rich / test4> test4out

cron程序使用提交作业的用户帐户运行脚本。因此,您必须具有访问命令列表中指定的命令和输出文件的适当权限。

crontab的更多功能

除了数字还有几个个特殊的符号就是*/-,*代表所有的取值范围内的数字, “/”代表每的意思, “/ 5”表示每5个单位, “ - ”代表从某个数字到某个数字, “”分开几个离散的数字。

基本格式

* * * * *命令
分时日月周命令
第1列表示分钟1~59每分钟用*或者* / 1表示
第2列表示小时1〜23(0表示0点)
第3列表示日期1〜31
第4列表示月份1〜12
第5列标识号星期0〜6(0表示星期天)
第6列要运行的命令

以下是这些命令的一些示例

#每月1,10,22日
45  4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
 #每两个小时
0 * / 2 * * * date
 #晚上11点到早上8点之间每两个小时,早上8点
0 23-7 / 2,8 * * *日期

很多时候,我们计划任务需要精确到秒来执行,根据以下方法,可以很容易地以秒执行任务。
以下方法将每10秒执行一次

#crontab -e

* * * * * / bin / date >> / tmp / date.txt
* * * * *睡10 ; / bin / date >> / tmp / date.txt
* * * * *睡20 ; / bin / date >> / tmp / date.txt
* * * * *睡30 ; / bin / date >> / tmp / date.txt
* * * * *睡40 ; / bin / date >> / tmp / date.txt
* * * * *睡50 ; / bin / date >> / tmp / date.txt

建立cron表

每个系统用户都可以拥有自己的cron表(包括root用户)来运行预定作业。Linux提供了用于处理cron表的crontab命令。要列出现有的cron表,请使用-l参数:

$ crontab -l
crontab中没有富
$

默认情况下,每个用户的cron表文件都不存在。要向cron表添加条目,请使用-e参数。执行此操作时,crontab命令将启动具有现有cron表的文本编辑器(如果尚不存在,则为空文件)。

cron目录

当您创建一个执行时间要求不太精确的脚本时,使用其中一个预先配置的cron脚本目录会更容易。有四个基本目录:每小时,每日,每月和每周。

$
$ ls /etc/cron.*ly
/etc/cron.daily:
0anacron aptitude exim4-base man-db sysstat
apt bsdmainutils logrotate popular-contest
apport dpkg mlocate标准 
/etc/cron.hourly:

/etc/cron.monthly中:
0anacron

/etc/cron.weekly文件:
0anacron apt-xapian-index man-db
$

因此,如果您有一个需要每天运行一次的脚本,只需将脚本复制到每日目录,然后cron每天执行它。

anacron计划

cron程序的唯一问题是它假设您的Linux系统每周7天,每天24小时运行。除非您在服务器环境中运行Linux,否则可能不一定如此。

如果在计划在crontable中运行作业时关闭Linux系统,则作业将不会运行。系统重新打开时,cron程序不会追溯性地运行错过的作业。要解决此问题,许多Linux发行版还包括anacron程序。

如果anacron确定某个作业错过了预定的运行,它会尽快运行该作业。这意味着,如果您的Linux系统已关闭几天,那么当它启动时,任何计划在其关闭期间运行的作业都会自动运行。

这是一种常用于执行例行日志维护的脚本的功能。如果在运行脚本时系统始终处于关闭状态,则日志文件将永远不会被修剪,并且可能会增长到不合需要的大小。使用anacron,您可以保证每次系统启动时都会修剪日志文件。

anacron程序只处理位于cron目录中的程序,例如/etc/cron.monthly。它使用时间戳来确定作业是否以适当的计划间隔运行。每个cron目录都有一个时间戳文件,位于/ var / spool / anacron中:

$
$ sudo cat /var/spool/anacron.monthly
20101123
$

anacron程序有自己的表(通常位于/ etc / anacrontab)来检查作业目录:

$
$ cat / etc / anacrontab
#/ etc / anacrontab:anacron的配置文件

#有关详细信息,请参阅anacron(8)和anacrontab(5)。

SHELL = / bin / sh
 PATH = / usr / local / sbin:/ usr / local / bin:/ sbin:/ bin:/ usr / sbin:/ usr / bin

#这些取代了cron的条目
1  5 cron.daily nice run-parts --report /etc/cron.daily
 7  10 cron.weekly nice run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly
$

anacron表的基本格式与cron表的基本格式略有不同:

周期延迟标识符命令

期间条目定义了作业的运行频率,以天为单位。anacron程序使用此条目来检查作业的时间戳文件。延迟条目指定系统启动后多长时间,anacron程序应运行错过的脚本。命令条目包含run-parts程序和cron脚本目录名。运行部件程序负责运行传递给它的目录中的任何脚本。

请注意,anacron不会运行位于/etc/cron.hourly中的脚本。这是因为anacron程序不处理执行时间少于每天的脚本。

标识符条目是唯一的非空白字符串 - 例如,每周一次。它用于在日志消息和错误电子邮件中唯一标识作业。

从头开始

启动shell脚本的最后一种方法是让您的脚本在Linux系统启动后或用户启动新的bash shell会话时自动运行。启动时启动脚本通常保留用于执行系统功能的特殊脚本,例如配置网络接口或启动服务器进程。但是,如果您是Linux系统管理员,则每次Linux系统引导时都需要执行一项功能,例如重置自定义日志文件或启动自定义应用程序。

每次用户启动新的bash shell时运行脚本的能力(即使只是在特定用户启动bash shell时)也可以派上用场。有时您希望为shell会话设置shell功能,或者只是确保已设置特定文件。

有关更多信息,您可以阅读以下两个博客,以了解有关如何在启动时启动脚本的更多信息 

参考

猜你喜欢

转载自blog.csdn.net/sunjinyan_1/article/details/81236203