一、在未来的某个时间点执行一次任务
1、at
at 时间
at> COMMAND
at>ctrlD
时间格式:
绝对时间,HH:MM, DD.MM.YY MM/DD/YY
相对时间,now+#(minutes,hours,days,weeks)
模糊时间,noon,midnight, teatime
###命令结果将以邮件的方式反馈给任务的制定者,注意邮件发送延迟
at -l,查看计划任务,默认所属队列为a
at -d JobID == atrm JobID
控制at命令的使用者
/etc/at.allow,白名单列表,如果同时存在此文件生效
/etc/at.deny,黑名单列表
2、batch
和at类似,但无需指定时间,计划任务会在系统空闲的时候执行
二、周期性地执行某任务:
由cron守护进程(clock daemon)来实现,cron进程每分钟被唤醒一次,查看一下crontab中是否有需要执行的命令。
注意:cron自身应该是一个不间断运行的服务,如果关闭系统,相应的计划则无法执行。
anacron:cron的补充,能够实现让cron因为各种原因在过去的时间应该执行而未执行的任务在恢复正常时执行一次。
1、cron:
---系统cron任务,定义在etc/crontab
格式如下:时间 用户 任务
---用户cron任务,定义在/var/spool/cron/USER/
格式如下:时间 任务
2、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来编辑,命令如下:
#EDITOR=vi
#export EDITOR
如果是C shell,$setenv EDITOR vi
注5: 修改用户的crontab,要想使其生效并不需要重启cron进程,只要用crontab filename就可以了;
注6: 命令后面可以接用户名,表示对该用户的crontab文件进行编辑显示等,例 crontab -e oracle;
注7: 执行结果会以邮件的方式反馈,可以使用重定向进行过滤,如 */3 * * * * cat /etc/fstab &> /dev/null 则不会向用户发送邮件提示
3、任务举例
每分钟执行一次任务:
*/3 * * * *
每两个小时执行一次任务:
0 */2 * * *
[总结:比该单位小的字段应该给确定的值,否则会在每个小时的每分钟都会执行,与期望相悖]
find / -xdev -name core -atime +7 -exec rm -f { } ';'
删除一星期都没访问过的core映象文件(程序崩溃时产生的映象文件)。
find / -xdev -atime +3 '(' -name '#*' -o -name '#*' -o -name '*.CKP' -o -name '*~' -o -name '.nfs~' ')' -exec rm -f { } ';'
删除以 #,.#或nfs开头的,或者是以 ~ 以及.CKP结尾的文件,还有3天未被访问的文件,不同类型的临时文件和编辑器的备份文件,都是这一模式的典型代表。
cd /tmp ; find . ! -name . ! -name lost+found -type d -mtime +3 -exec /bin/rm -rf { } ';'
递归删除/tmp下的72小时未修改的所有子目录。/tmp下的普通文件会在系统启动时被系统启动脚本删除,但有些系统不会删除目录。