我确信,当你开始使用脚本时,你会想要在预设的时间运行脚本,通常是在你不在的时候。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功能,或者只是确保已设置特定文件。
有关更多信息,您可以阅读以下两个博客,以了解有关如何在启动时启动脚本的更多信息 。