linux周期任务

一、在未来的某个时间点执行一次任务

at, batch, atq, atrm - queue, examine or delete jobs for later execution

root@darkstar:~# at now+5minutes
warning: commands will be executed using /bin/sh
at> echo "hello at"
at> <EOT>
job 1 at Tue Mar 22 14:15:00 2016

说明:
1. 时间格式:
- 绝对时间,HH:MM, DD.MM.YY MM/DD/YY
- 相对时间,now+#(minutes,hours,days,weeks)
- 模糊时间,noon,midnight, teatime
2. 命令结果将以邮件的方式反馈给任务的制定者,注意邮件发送延迟
3. at -l,查看计划任务,默认所属队列为a
4. at -d JobID == atrm JobID删除计划任务
5. 控制at命令的使用者
/etc/at.allow,白名单列表,如果同时存在此文件生效
/etc/at.deny,黑名单列表
6. batch和at类似,但无需指定时间,计划任务会在系统空闲的时候执行

二、周期性地执行某任务:

linux下的周期任务由crond守护进程(clock daemon)来实现,crond进程每分钟被唤醒一次,然后检查crontab中是否有需要执行的命令。crond自身应该是一个不间断运行的服务,如果关闭系统,相应的计划则无法执行。
anacron:cron的补充,能够实现让cron因为各种原因在过去的时间应该执行而未执行的任务在恢复正常时执行一次。

  1. crond本身的管理

    • 启动服务 /sbin/service crond start
    • 关闭服务 /sbin/service crond stop
    • 重启服务 /sbin/service crond restart
    • 重新载入配置 /sbin/service crond reload
    • 可以将这个服务在系统启动的时候自动启动:
      在/etc/rc.d/rc.local这个脚本的末尾加上: /sbin/service crond start
  2. 待执行的cron任务

    • 系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存。对应的任务定义在etc/crontab,格式为:时间 用户 任务
    • 个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。用户cron任务定义在/var/spool/cron/USER/,格式为:时间 任务
  3. cron任务的管理
    crontab [-u user] [-l | -r | -e] [path/to/file]

    • -u user:修改指定用户的crontab文件。如果不指定该选项,crontab将默认为是操作者本人的crontab。
    • -l:在标准输出上显示当前的crontab任务。
    • -r:删除当前的crontab任务。
    • -e:使用环境变量指定的编辑器编辑crontab文件,当结束编辑离开时,编辑后的文件将自动安装。
    • -d [user]:删除用户目前的crontab.
    • -c dir:指定crontab的目录。
    • file:是一个crontab文件的来源文件,内容如下:
      * * * * * command to be executed
      - - - - -
      | | | | |
      | | | | +—– 星期 (1 - 7) (monday = 1)
      | | | +——- 月 (1 - 12)
      | | +——— 天 (1 - 31)
      | +———– 时 (0 - 23)
      +————- 分 (0 - 59)
      注1: 文件最后不要留空行,否则认为文件末尾结束异常
      注2: 要运行的程序不应该加引号。由于环境变量的原因,命令尽量使用绝对路径或者在脚本开头定义环境变量
      注3: 五个时间字段的语法说明
      不能为空,可以使用统配符*表示任何时间。
      可以指定多个值,它们之间用逗号间隔。例如:1,3,7。
      可以指定时间段,用减号间隔。例如:0-6。
      可以用/n表示步长。例如:8-18/2表示时间序列8,10,12,14,16,18
      注4 :crontab -e没有启动vi
      解决办法:利用EDITOR环境变量来指定crontab的编辑器, 如果想使用vi来编辑,命令如下:
      #export EDITOR=vi
      如果是C shell,$setenv EDITOR vi
      注5: 修改用户的crontab,要想使其生效并不需要重启cron进程,只要用crontab filename就可以了;
      注6: 命令后面可以接用户名,表示对该用户的crontab文件进行编辑显示等,例 crontab -e oracle;
      注7: 执行结果会以邮件的方式反馈,可以使用重定向进行过滤,如 */3 * * * * cat /etc/fstab &> /dev/null则不会向用户发送邮件提示
  4. 任务举例

    • 每分钟执行一次任务:
      */3 * * * * CMD
    • 每两个小时执行一次任务:
      0 */2 * * * CMD

    说明:

    • 比该单位小的字段应该给确定的值,否则会在每个小时的每分钟都会执行,与期望相悖
    • CMD经常为
      1. find / -xdev -name core -atime +7 -exec rm -f { } ';'
        删除一星期都没访问过的core映象文件(程序崩溃时产生的映象文件)。
      2. find / -xdev -atime +3 '(' -name '#*' -o -name '#*' -o -name '*.CKP' -o -name '*~' -o -name '.nfs~' ')' -exec rm -f { } ';'
        删除以 #,.#或nfs开头的,或者是以 ~ 以及.CKP结尾的文件,还有3天未被访问的文件,不同类型的临时文件和编辑器的备份文件,都是这一模式的典型代表。
      3. cd /tmp ; find . ! -name . ! -name lost+found -type d -mtime +3 -exec /bin/rm -rf { } ';'
        递归删除/tmp下的72小时未修改的所有子目录。/tmp下的普通文件会在系统启动时被系统启动脚本删除,但有些系统不会删除目录。

你可能感兴趣的:(linux,crond,batch,at)