加载中…
个人资料
老徐
老徐
  • 博客等级:
  • 博客积分:0
  • 博客访问:822,939
  • 关注人气:156
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

[Linux]定时启动任务的一些命令

(2013-01-15 12:40:05)
标签:

linux

script

shell

it

分类: Linux/Shell
在Linux 操作系统,利用Shell脚本,生成类似“20110323_111538.txt”以“年月日_时分秒”命名的文件。
 
Linux Shell 脚本:
#!/bin/sh
echo test >> $(date -d "today" +"%Y%m%d_%H%M%S").txt




要使用自动启动进程的功能,就需要掌握以下几个启动命令:


  at 命令
==================================================================
  at [-V] [-q 队列 ] [-f 文件名 ] [-mldbv] 时间
  at -c 作业 [ 作业 ...]
  at 允许使用一套相当复杂的指定时间的方法,实际上是将 POSIX.2 标准扩展了。它可以接受在当天的 hh:mm (小时  : 分钟)式的时间指定。如果该时间已经过去,那么就放在 第二天执行。用户还可以采用 12 小时计时制,即在时间后面加上 AM (上午)或者 PM (下午)来说明是上午还是下午。可以指定命令执行的具体日期,指定格式为 month day (月 日)或者 mm/dd/yy (月 / 日 / 年)或者 dd.mm.yy (日 . 月 . 年)。指定的日期必须跟在指定时间 的后面。


  上面介绍的都是绝对计时法,其实还可以使用相对计时法。 指定格式为: now + count time-units , now 就是当前时间, time-units 是时间单位,这里可以是 minutes (分钟)、 hours (小时)、 days (天)、 weeks (星期)。 count 是时间的数量,究竟是几天,还是几小时,等 等。还有一种计时方法就是直接使用 today (今天)、 tomorrow (明天)来指定完成命令的时间。

  [例]指定在今天下午 5:30 执行某命令。假设现在时间是中午 12:30 , 2008 年 2 月 24 日,其命令格式如下:
  at 5:30pm
  at 17:30
  at 17:30 today
  at now + 5 hours
  at now + 300 minutes
  at 17:30 24.2.99
  at 17:30 2/24/99
  at 17:30 Feb 24

[例]
  $at -f work 4pm + 3 days
  在三天后下午 4 点执行文件 work 中的作业。
  $at -f work 10am Jul 31
  在 7 月 31 日上午 10 点执行文件 work 中的作业。

  在任何情况下,超级用户都可以使用这个命令。对于其他用户来说,是否可以使用就取决于两个文件: /etc/at.allow和 /etc/at.deny 。如果 /etc/at.allow 文件存在的话,那么只有在其中列出的用户才可以使用 at 命令;如果该文件不存在,那么将检查 /etc/at.deny 文件是否存在,在这个文件中列出的用户均不能使用该命令。如果两个文件都不存在,那么只有超级用户可以使用该命令;空的 /etc/at.deny文件意味着所有的用户都可以使用该命令,这也是默认状态。


  如果 at 命令是从一个使用 su 命令切换到用户 shell 中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户。但是如果有邮件送出的话,收到邮件的将是原来的用户,也就是登录时 shell 的所有者。

   at  命令中的参数
-V 将标准版本号打印到标准错误中。
-q queue 使用指定的队列。队列名称是由单个字母组成,合法的队列名可以由 a-z 或者 A-Z 。 a 队列是 at 命令的默认队列。
-m 作业结束后发送邮件给执行 at 命令的用户。
-f file 使用该选项将使命令从指定的 file 读取,而不是从标准输入读取。
-l atq 命令的一个别名。该命令用于查看安排的作业序列,它将列出用户排在队列中的作业,如果是超级用户,则列出队列中的所有工作。命令的语法格式如下 :atq [-V] [-q 队列 ][-v]
-d atrm 命令的一个别名。该命令用于删除指定要执行的命令序列,语法格式如下 :atrm [-V] 作业 [ 作业 ...]
-c 将命令行上所列的作业送到标准输出。
  $ at 2:00 12/25/08
  warning:command will be executed using /bin/sh.
  提醒用户将使用哪个 shell 来执行该命令序列。 然后系统出现 at> 提示符,等待用户输入进一步的信息,也就是需要执行的命令序列:
  at> find / -name “*.txt”|lpr
  at> echo “foxy : All texts have been printed.You
  can take them over.Good day!River” |mail -s ”job
  done” foxy
  输入完每一行指令然后回车,所有指令序列输入完毕后,使用组合键结束 at 命令的输入。这时候屏幕将出现如下信息:
  job 1 at 2008-12-25 02:00

  实际上如果命令序列较长或者经常被执行的时候,一般都采用将该序列写到一个文件中,然后将文件作为 at 命令的输入来处理。这样不容易出错。

例 ] 找出系统中所有以 txt 为后缀名的文件,并且进行打印。打印结束后给用户 foxy 发出邮件通知取件。指定时间为十二月二十五日凌晨两点。
 $at  /tmp/aa 中的内容为
 find / -name “*.txt” | lpr
 echo “foxy:All texts have been printed. River” |mail -s
 ”JobDone” foxy
 系统会在十二月二十五日凌晨两点查找系统中所有的扩展名为 txt 的文件打印,打印完毕给 foxy 发送一封邮件,在这里重定向符 < 可以使用 -f 参数

 

 

  batch 命令

==================================================================
  batch 用低优先级运行作业,该命令几乎和 at 命令的功能完全相同,唯一的区别在于, at 命令是在指定时间,很精确的时刻执行指定命令;而 batch 却是在系统负载较低,资源比较空闲的时候执行命令。该命令适合于执行占用资源较多的命令。
  batch 命令的语法格式也和 at 命令十分相似,即batch [-V] [-q 队列 ] [-f 文件名 ] [-mv] [ 时间 ]
  一般地说,不用为 batch 命令指定时间参数,因为 batch本身的特点就是由系统决定执行任务的时间,如果用户再指
  定一个时间,就失去了本来的意义。具体的参数解释可以参考 at 命令。
  $batch
  at> find / -name *.txt|lpr
  at> echo “foxy : All texts have been printed.You  can take them over.Good day!River” |mail -s ”job  done” foxy
  所有指令序列输入完毕后,使用组合键结束 at 命令的输入 。

 

 

  cron 命令

==================================================================

    前面的 at 和 batch 命令都会在一定时间内完成一定任务,但是要注意它们都只能执行一次。也就是说,当指定了运行命令后,系统在指定时间完成任务,一切就结束了。但是在很多时候需要不断重复一些命令,这时候就可以使用 cron 命令来完成任务。
    cron 命令在系统启动时就由一个 shell 自动启动,进入后台(所以不需要使用 & 符号)。
    一般的用户没有运行该命令的权限,虽然超级用户可以手工启动 cron ,不过还是建议将其放到 shell 中由系统自行启动。
    首先 cron 命令会搜索 /var/spool/cron 目录,寻找以 /etc/passwd 文件中的用户名命名的 crontab 文件,被找到的这种文件将载入内存。例如 /etc/passwd 中一个用户名为foxy 的用户,它所对应的 crontab 文件就应该  是 /var/spool/cron/foxy 。也就是说,以该用户命名的crontab 文件存放在 /var/spool/cron 目录下面。 cron 命令还将搜索 /etc/crontab 文件,这个文件是用不同的格式写成的。
    cron 启动以后,它将首先检查是否有用户设置了 crontab文件,如果没有就转入“休眠”状态,释放系统资源。所以该后台进程占用资源极少。它每分钟“醒”过来一次,查看当前是否有需要运行的命令。 命令执行结束后,任何输出都将作为邮件发送给 crontab 的所有者,或者是/etc/crontab 文件中 MAILTO 环境变量中指定的用户。

   上面简单介绍了一些 cron 的工作原理,但是 cron 命令的执行不需要用户干涉;需要用户修改的是 crontab 中要执行的命令序列,所以下面介绍 crontab 命令。

 

 

  crontab 命令

==================================================================

      crontab 命令用于安装、删除或者列出用于驱动 cron 后台进程的表格。也就是说,用户把需要执行的命令序列放到crontab 文件中以获得执行。每个用户都可以有自己的rontab 文件。下面就来看看如何创建一个 crontab 文件。
      在 /var/spool/cron 下的 crontab 文件不可以直接创建或者直接修改。 crontab 文件是通过 crontab 命令得到的。现在假设有个用户名为 foxy ,需要创建自己的一个 crontab文件。首先可以使用任何文本编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的时间。然后存盘退出。假设该文件为 /tmp/test.cron 。再后就是使用 crontab 命令来安装这个文件,使之成为该用户的crontab 文件。输入: crontab test.cron这样一个 crontab 文件就建立好了。可以转到 /var/spool/cron 目录下面查看,发现多了一个 foxy 文件。这个文件就是所需的 crontab 文件。


  crontab 命令的语法格式
  crontab [ -u user ] file
  crontab [ -u user ] {-l|-r|-e}
      第一种格式用于安装一个新的 crontab 文件,安装来源就是 file 所指的文件,如果使用“ -” 符号作为文件名,那就意味着使用标准输入作为安装来源。
  -u 如果使用该选项,也就是指定了是哪个具体用户的crontab 文件将被修改。如果不指定该选项, crontab 将默认是操作者本人的 crontab ,也就是执行该 crontab 命令的用户的 crontab 文件将被修改。但是请注意,如果使用了 su 命令再使用 crontab 命令很可能就会出现混乱的情况。所以如果是使用了 su 命令,最好使用 -u 选项来指定究竟是哪个用户的 crontab 文件。
  -l 在标准输出上显示当前的 crontab 。
  -r 删除当前的 crontab 文件。
  -e 使用 VISUAL 或者 EDITOR 环境变量所指的编辑器编辑当前的 crontab 文件。当结束编辑离开时,编辑后的文件将自动安装。


  crontab 文件的格式说明 :
  * 逗号 (',') 指定列表值。如 : "1,3,4,7,8"
  * 中横线 ('-') 指定范围值 如 "1-6", 代表 "1,2,3,4,5,6"
  * 星号 ('*') 代表所有可能的值
     在 crontab 文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔,每个域当中有多个值的时候可以使用逗号来分隔。
  # Use the hash sign to prefix a comment
  # +------------ minute (0 - 59)
  # | +---------- hour (0 – 23 , 00 点就是晚上 12 点 )
  # | | +-------- day of month (1 - 31)
  # | | | +------ month (1 - 12)
  # | | | | +---- day of week (0 - 7) (Sunday=0 or 7)
  # | | | | |
  # * * * * * command to be executed


  [例]
  5,15,25,35,45,55 16,17,18 * * * command
  这就是表示任意天任意月,其实就是每天的 16 点、 17 点、 18点的 5 min 、 15 min 、 25 min 、 35 min 、 45 min 、 55  min 时执行 command 命令。
  [ 例 ] 每天每小时的 1 分执行用户目录下的 bin/account 这个指令:
  1 * * * * bin/account
  [例]
  每天三点二十分执行用户目录下如下所示的两个指令 ( 每个指令以 ; 分隔 )
  20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire>expire.1st)
  [ 例 ] 我们来看一个超级用户的 crontab 文件:
  #Run the ‘atrun' program every minutes
  #This runs anything that's due to run from ‘at’.See man  ‘at’ or ‘atrun’.
  0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun
  40 7 * * * updatedb
  8,10,22,30,39,46,54,58 * * * * /bin/sync

  如果需要改变其中的命令内容时,还是需要重新编辑原来的文件,然后再使用 crontab命令安装。

      可以使用 crontab 命令的用户是有限制的。 如果 /etc/cron.allow 文件存在,那么只有 其中列出的用户才能使用该命令;如果该文件不存在但 cron.deny 文件存在,那么只有未列在该文件中的用户才能使用 crontab 命令;如果两个文件都不存在,那就取决于一些参数的设置,可能是只允许超级用户使用该命令,也可能是所有用户都可以使用该命令。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有