a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 103|回复: 2

[综合辅导] Linux辅导:详细解读linuxatcron命令

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
用户使用at命令在指定时刻执行指定的命令序列。也就是说,该命令至少需要指定一个命令、一个执行时间才能够正常运行。at命令能够只指定时间,也能够时间和日期一起指定。需要注意的是,指定时间有个系统判别问题。比如说:用户现在指定了一个执行时间:凌晨3:20,而发出at命令的时间是头天晚上的20:00,那么究竟是在哪一天执行该命令呢?假如用户在3:20以前仍然在工作,那么该命令将在这个时候完成;假如用户3:20以前就退出了工作状态,那么该命令将在第二天凌晨才得到执行。下面是at命令的语法格式:   at [-V] [-q 队列] [-f 文档名] [-mldbv] 时间  E% S% k; n$ n9 A( G7 v; J6 ]
  at -c 作业 [作业...]
* P9 q" Q0 Q% W# [  at允许使用一套相当复杂的指定时间的方法,实际上是将POSIX.2标准扩展了。他能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。
5 E/ @, x, C- s1 F# R  也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。  E8 ~4 A, {5 e# S* c, ]
  上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:now + count
2 ~5 ~" ?; ]+ [# L$ a+ z5 K- s  time-units ,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。* q& J# m6 T9 J9 g4 t; a
  更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。下面通过一些例子来说明具体用法。
, R# ?% }' z8 D4 c/ e) F$ T% S- D  [例2] 指定在今天下午5:30执行某命令。假设现在时间是中午12:30,1999年2月24日,其命令格式如下:
5 o( B* F' H) `+ l: l  ?2 S  at 5:30pm2 p0 u, {( Y8 k
  at 17:30
. X6 L! ]7 W2 I1 H! c  at 17:30 today/ Q! O. p7 J( ~# j" j1 l. a
  at now + 5 hours
7 e! t: |7 D# _$ D: Y  at now + 300 minutes6 {# V1 M& w6 W3 u  a
  at 17:30 24.2.99' ~4 r! y/ D2 W6 Y/ W3 I
  at 17:30 2/24/99
7 d! R0 L1 ]; ]+ s  at 17:30 Feb 24
1 h9 _, I# I8 i. _: s. N  以上这些命令表达的意义是完全相同的,所以在安排时间的时候完万能够根据个人喜好和具体情况自由选择。一般采用绝对时间的24小时计时法能够避免由于用户自己的疏忽造成计时错误的情况发生,例如上例能够写成:9 H/ t- |$ L. K" Q( I0 L+ p- B  M
  at 17:30 2/24/996 D2 e; v6 Y/ m
  这样很清楚,而且别人也看得懂。) V( A  t9 ]& m6 l
  对于at命令来说,需要定时执行的命令是从标准输入或使用-f选项指定的文档中读取并执行的。假如at命令是从一个使用su命令转换到用户shell中执行的,那么当前用户被认为是执行用户,任何的错误和输出结果都会送给这个用户。但是假如有邮件送出的话,收到邮件的将是原来的用户,也就是登录时shell的任何者。
- O  |! O! M2 }* P" `  [例3]: p2 Z$ @2 A. y( h$ W9 S7 e9 j
  $ at -f work 4pm + 3 days
5 W/ f2 @' r5 |, d  在三天后下午4点执行文档work中的作业。) M4 P6 G$ Q+ w
  $ at -f work 10am Jul 31
1 c+ k2 J. {( e9 f  X8 A% s  在7月31日上午10点执行文档work中的作业。) @5 b1 Z4 T& a5 e! m! T# l

6 ]1 T0 U/ M3 {4 l' n9 |  在任何情况下,终极用户都能够使用这个命令。对于其他用户来说,是否能够使用就取决于两个文档:/etc/at.allow和/etc/at.deny。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:07:08 | 显示全部楼层

Linux辅导:详细解读linuxatcron命令

</p>  假如/etc/at.allow文档存在的话,那么只有在其中列出的用户才能够使用at命令;假如该文档不存在,那么将检查/etc/at.deny文档是否存在,在这个文档中列出的用户均不能使用该命令。假如两个文档都不存在,那么只有终极用户能够使用该命令;空的/etc/at.deny文档意味着所有的用户都能够使用该命令,这也是默认状态。$ \% W' y: [" t; l
 下面对命令中的参数进行说明。
* w' l7 u: q' U0 k( X7 a  -V 将标准版本号打印到标准错误中。% ~: ?9 S) h$ t; |/ a8 @6 s5 U0 Z4 C4 \
  -q queue 使用指定的队列。队列名称是由单个字母组成,合法的队列名能够由a-z或A-Z。a队列是at命令的默认队列。
9 B% `2 m2 ]1 O4 a9 C5 J  -m 作业结束后发送邮件给执行at命令的用户。
, `, t  V9 o: t; T. t+ A  -f file 使用该选项将使命令从指定的file读取,而不是从标准输入读取。* E3 `; H/ O) H8 H% U+ W+ r2 y
  -l atq命令的一个别名。该命令用于查看安排的作业序列,他将列出用户排在队列中的作业,假如是终极用户,则列出队列中的任何工作。, J4 m& h1 G% x2 ~: G; m
  命令的语法格式如下:
& b  e3 E  z+ a  atq [-V] [-q 队列] [-v]! F8 m! M  k% F/ @3 {& ]8 T. P* E
  -d atrm 命令的一个别名。该命令用于删除指定要执行的命令序列,语法格式如下:
* F7 F: y4 m# J3 a2 ]% Y  atrm [-V] 作业 [作业...]
7 d2 f3 _8 y) O- q0 p  -c 将命令行上所列的作业送到标准输出。: d" z, y, X, U
  [例4] 找出系统中任何以txt为后缀名的文档,并且进行打印。打印结束后给用户foxy发出邮件通知取件。指定时间为十二月二十五日凌晨两点。
1 ~/ H, x4 t1 h/ q( z/ E" p$ R" J- `5 s  首先键入:4 a) ~" X. G/ ~5 y* ]4 r, G
  $ at 2:00 12/25/99
4 A* k' J& K3 k& `+ j  然后系统出现at>提示符,等待用户输入进一步的信息,也就是需要执行的命令序列:0 P. ~% C0 z6 J- e3 s9 _0 S/ M
  at> find / -name "*.txt"|lpr
5 y" p# {$ x  D+ m) a. J+ `  at> echo "foxy:All texts have been printed.You can take them over.Good day!River" |mail -s "job done" foxy# S+ Q, I$ u1 h  y0 ^& y
  输入完每一行指令然后回车,任何指令序列输入完毕后,使用组合键结束at命令的输入。这时候屏幕将出现如下信息:
* Y( i( c$ R* n2 [8 |9 E3 J  warning:command will be executed using /bin/sh.
+ j: a( l1 m& w! i  job 1 at 1999-12-25 02:009 Q9 G4 J! D& h7 y0 ]5 J3 G
  提醒用户将使用哪个shell来执行该命令序列。& {3 _8 o0 a" o' j) l- W" f) o
 实际上假如命令序列较长或经常被执行的时候,一般都采用将该序列写到一个文档中,然后将文档作为at命令的输入来处理。这样不容易出错。
5 y# r: W: D' D: r  [例5] 上面的例子能够修改如下:
# ~3 k6 _+ i9 E4 m  将命令序列写入到文档/tmp/printjob,语句为:' B1 E* N( }+ c5 {
  $ at -f /tmp/printjob 2:00 12/25/997 T: {9 o) @2 W, j" J! N- @
  这样一来,at命令将使用文档中的命令序列,屏幕显示如下:
$ L& [8 w- {/ X( A1 M2 x- r  Warning:command will be executed using /bin/sh.% |7 {# G6 a& N, w% n6 d1 Z
  job 2 at 1999-12-25 02:00
! L, H$ K/ Q( J% `0 C# |  /sbin/service crond start //启动服务( P: D" `, k: ?* q- D) A
  /sbin/service crond stop //关闭服务
! q0 T4 V: B2 ^" o3 E  /sbin/service crond restart //重启服务
; c- [1 @$ z8 c+ y: y2 w: n  K  /sbin/service crond reload //重新载入配置) O7 v1 }$ f. ]: f
  可以将这个服务在系统启动的时候也自动启动:" e8 i! q/ e3 P0 [6 P
  在/etc/rc.d/rc.local这个脚本的末尾加上:
$ e% Z" y) X$ Y9 D  /sbin/service crond start! c% m  a$ {0 M  m, @
  1.直接用crontab命令编辑( B" q3 g; b6 U
  cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
- ?" u2 j6 q' v: C7 K! k! D  crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
1 E- |. S' }, L) f  crontab -l //列出某个用户cron服务的详细内容
5 C( m! a/ a' a5 o3 e0 u  crontab -r //删除没个用户的cron服务, e0 j$ b0 U* U6 Z1 Z0 A/ f( q
  crontab -e //编辑某个用户的cron服务6 I  N5 L2 G3 |+ F& o
  比如说root查看自己的cron设置:
  H1 f9 f5 [3 `0 W/ b; L! Q. @+ A0 [8 r' b  g' H% Q
  crontab -u root -l
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:07:09 | 显示全部楼层

Linux辅导:详细解读linuxatcron命令

</p>  再例如,root想删除fred的cron设置:8 @6 g$ n# R# b$ O
  crontab -u fred -r: l8 L1 E& v) {" Q2 l
在编辑cron服务时,编辑的内容有一些格式和约定,输入:
& l3 ~/ j) `. t+ V5 R  引用:
: M& `( W& ?; b8 c: @. J$ P+ d  crontab -u root -e4 A) i) m+ w, j  ]# y+ c, a. ~
  进入vi编辑模式,编辑的内容一定要符合下面的格式:0 B) j* J5 o7 V$ S! _! n
  */1 * * * * ls >> /tmp/ls.txt6 O9 S* b, K, u' e; M7 I2 C6 S
  这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:' k4 r) L7 S$ F/ q9 F  I8 l
  引用:
/ ?( e4 U. ]# ~& D. N% J  分钟 (0-59)
0 P4 K" I  ^0 L2 O, P2 K4 f  小時 (0-23)2 i  x# z2 ?8 z
  日期 (1-31)
' q7 x# T. }# ^- q6 e5 o; J  月份 (1-12)
$ y7 M, m/ L. y$ V  星期 (0-6)//0代表星期天" ?& Y! f# }8 {; a" }" b
  除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"*/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。以下举几个例子说明问题:
: o' [! t$ e, p) j" L9 k  U, n5 j  引用:9 u. D* C* [* C$ N
  每天早上6点
: C8 @$ s5 f+ F+ Z* i. Z, o7 d, T# c  0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。5 {8 U  R$ l- G6 X; }
  每两个小时
: z0 W6 z2 u' c2 P. g- ~% i& \  0 */2 * * * echo "Have a break now." >> /tmp/test.txt
2 e* D2 P! W0 {  晚上11点到早上8点之间每两个小时,早上八点9 E* I* d0 N( G5 v
  0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
' u8 G" K2 z4 @* E$ O+ Q  每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
, |1 T- E. O1 D" J7 {4 ?5 ?  0 11 4 * 1-3 command line
, f8 z8 V1 k; Q2 Q: L  1月1日早上4点
* J% t- j3 m) {3 p! N  0 4 1 1 * command line* e& {2 Y+ k; F" O9 r$ [% J
  2.编辑/etc/crontab 文件配置cron1 e3 @# c( t- D5 [8 B3 e
  cron 服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:
, ^9 v; q4 T& t8 }3 }# D0 e  SHELL=/bin/bash% C* h! E) {: l: J1 \' s
  PATH=/sbin:/bin:/usr/sbin:/usr/bin
. l; U  B- T0 p3 ^: k4 z# Q- f. p  MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号2 Y' F( k8 I6 e) B
  HOME=/
4 p8 Y) S* u4 o9 J8 H0 Y2 m  # run-parts) W9 {9 z) z8 H. V
  01 * * * * root run-parts /etc/cron.hourly //每个小时去执行一遍/etc/cron.hourly内的脚本4 L" ~4 S! r) U$ `5 E
  02 4 * * * root run-parts /etc/cron.daily //每天去执行一遍/etc/cron.daily内的脚本
+ ~+ r. ^: B$ i" m/ v  22 4 * * 0 root run-parts /etc/cron.weekly //每星期去执行一遍/etc/cron.weekly内的脚本
% L# T+ `; p1 |8 Q9 n) |& r2 n  j  42 4 1 * * root run-parts /etc/cron.monthly //每个月去执行一遍/etc/cron.monthly内的脚本; x! O/ J2 ~" o0 I
  使用者 运行的路径
# m* Z, J% R# W4 X& w  注意"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-17 08:13 , Processed in 0.292493 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表