1、at命令
at命令允许指定Linux系统何时运行脚本,它会将作业提交到队列中,指定shell在什么时候运行该作业。
at 的守护进程 atd 在后台运行,在作业队列中检查待运行的作业。
at 守护进程会检查系统的一个特殊目录(一般位于/var/spool/at 或 /var/spool/cron/atjobs),并从中获取at命令提交的作业。默认情况下,atd守护进程会每隔60秒检查一次此目录,如果目录下有作业,atd守护进程就会查看此作业的运行时间,若时间跟当前时间一致,就运行此作业。
格式:
at [-f filename] time
默认情况下,at命令会将STDIN的输入放入队列。可以用-f选项指定用于从中读取命令的文件名。
time选项指定用户希望运行该作业的时间。如果用户指定的时间已经过去,那么at命令会在第二天的同一时刻运行该作业。
at 命令能识别多种时间格式:
- 标准的小时和分钟:11:25
- AM/PM指示符:4:18 PM
- 特定的时间名称:now、noon、midnight、teatime(4:00 p,m.)
- 标准日期:MMDDYY、MM/DD/YY、DD.MM.YY
- 文本日期:Feb 7、Sept 15;可加可不加年份
- 时间增量:Now+25minutes、4:30 PM tomorrow、4:13 + 5 days
使用at命令后,作业就会被提交至作业队列。作业队列保存着通过 at 命令提交的待处理作业。针对不同优先级,共有52种作业队列。作业队列通常用小写字母a~z和大写字母A~Z来指代。
作业队列的字母排序越高,此队列中的作业运行优先级就越低(谦让度更大)。默认情况下,at 命令提交的作业会被放入a队列。如果想降低优先级,可以使用 -q 选项指定其他的队列,比如如果想少占用cpu时间,可以将其放入z队列。
获取作业的输出
默认情况下,Linux系统会将提交该作业的用户email作为STDOUT和STDERR,即通过邮件系统传给该用户。
但这种输出很不方便,尤其是未安装sendmail的情况下。故而可以在脚本中对STDOUT和STDERR进行重定向。
#!/bin/bash
outfile=$HOME/outfile.out
echo "此脚本会在$(date +%B%d,%T)运行" > outfile
echo >> outfile
echo "此脚本使用的是$SHELL shell." >> outfile
echo >> outfile
sleep 4
echo "脚本运行结束" >> outfile
exit
-M选项,禁止作业产生的输出信息。
查询等待中的作业
atq 命令可以查询系统中有哪些作业在等待。
如下所示,atq命令列出了作业号,系统运行该作业的日期和时间,该作业所在的作业队列及用户账户名
删除作业
atrm 命令用于删除等待中的作业,通过指定作业号即可。只能删除自己的作业,不能删除其他人的作业(root用户除外)
2、cron程序
Linux系统使用cron程序调度需要定期执行的作业。cron在后台运行,并且会检查一个特殊的表,即cron时间表,从中获取已安排执行的作业。
格式:
minutepasthour hourofday dayofmonth month dayofweek command
cron时间表允许使用特定值、取值范围(如1~7)或者通配符(星号*)来指定各个字段。
- 20 7 * * * command:在每天的7:20执行command命令
- 00 11 1 * * command:在每月第一天的中午11点执行命令。
设置在每月的最后一天执行:使用date命令检查明天的日期是不是某个月份的第一天(01)。
00 11 28~31 * * if [ "$(date +%d -d tomorrow)" = 01 ];then command; fi
命令列表必须指定要运行的命令或脚本的完整路径。同时可以像在命令行中那样,添加所需的任何选项和重定向符。
20 7 * * * /home/csb_user1/tesh.sh > backup.out
cron程序会以提交作业的用户身份运行该脚本,因此运行前得确认有访问该脚本以及输出文件的权限。
cron时间表
crontab -e:创建定时任务
crontab -l:列出当前用户下的全部定时任务
cron目录
如果定时任务对执行时间的精确性要求不高,可以使用预配置的cron脚本目录。预配置的基础目录共有4个:hourly、daily、monthly、weekly
如果脚本要每天都执行,则将脚本复制到daily目录下,cron就会每天运行它。
3、anacron程序
cron程序唯一的缺点是它假定Linux系统是7x24小时运行的。但如果某个作业在cron时间表中设置的运行时间已到,且此时Linux系统处于关闭状态,那么该作业就不会运行。当再次启动系统时,cron程序不会再去运行那些已错过的作业。
anacron程序判断出某个作业错过了设置的运行时间,它会尽快运行该作业。即使Linux系统关闭了几天,等再次启动时,原计划在关机期间运行的作业会自动运行。
但anacrom程序只处理位于cron目录的程序,比如/etc/cron.daily。它通过时间戳判断作业是否在正确的计划时间间隔内运行了。每个cron目录都有一个时间戳文件,该文件位于/var/spool/anacron
anacron程序使用自己的时间表(/etc/anacrontab)来检查作业目录。
anacron时间表格式:
period delay identifier command
- period:定义了作业的运行频率(以天为最小单位)。anancron程序利用该字段检查作业的时间戳文件。
- delay:指定了在系统启动后,anacron程序需要等待多少分钟再开始运行错过的脚本。
- identifier:是一个特殊的非空字符串,如:cron.weekly。它唯一的作用是标识出现在日志消息和错误email中的作业。
- command:包含run-parts程序和一个cron脚本目录名。run-parts程序负责运行指定目录中的所有脚本。
anacron不会运行位于/etc/cron.hourly目录的脚本,因为anacron并不处理执行时间需求少于一天的脚本。