目录
单一执行的例行性工作at
语法
选项
时间格式
at的工作文件存放目录
at工作的日志文件
实例
命令总结:
循环执行的例行性工作crond
语法
选项
crontab工作调度对应的系统服务
crontab工作的日志文件
用户定义计划任务的文件所在目录
动态查看
crontab文件格式
文件中的特殊字符
crond服务
查看crontab服务状态
手动启动crontab服务
实例
可唤醒停机期间的工作任务
单一执行的例行性工作at
单一执行的例行性工作:仅处理执行一次就结束了
语法
at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...]
选项
-m 当任务完成之后,即使没有标准输出,将给用户发送邮件
-l atq的别名,可列出目前系统上面的所有该用户的at调度
-d atrm的别名,可以取消一个在at调度中的工作
-v 使用较明显的时间格式,列出at调度中的任务列表
-c 可以列出后面接的该项工作的实际命令内容(脚本)== cat /var/spool/at/xxxxxxx
-f 从文件中读取作作业
时间格式
HH:MM 在今天的HH小时MM分钟执行,如果今天的这个时间点已经过了,则明
天执行
HH:MM YYYY-MM-DD 强制规定在某年某月的某一天的特殊时刻进行该工作
now + 2 minutes 从现在开始几分钟minutes, hours, days, or weeks
at命令 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用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(明天)来指定完成命令的时间。
/etc/at.allow,写在该文件的用户可以使用at命令
/etc/at.deny,黑名单
两个文件如果都不存在,只有root能使用
#at工作调度对应的系统服务
[root@localhost ~]# systemctl status atd ---必须写成程序名 或者 ps -ef | grep at
at的工作文件存放目录
[root@localhost ~]# ll /var/spool/at
创建的at任务目录也能在/var/spool/at 目录下能找到这么一个脚本文件
at工作的日志文件
[root@localhost ~]# ll /var/log/cron
实例
三天后的下午 5 点钟执行/bin/ls
:
[root@localhost ~]# at 5pm+3 days
at> /bin/ls
at> <EOT>
job 7 at 2024-01-08 17:00
明天17点钟,输出时间到指定文件内:
[root@localhost ~]# at 17:20 tomorrow
at> date >/root/2024.log
at> <EOT>
job 8 at 2024-01-06 17:20
计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务:
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
删除已经设置的任务:
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
[root@localhost ~]# atrm 7
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
显示已经设置的任务内容:
[root@localhost ~]# at -c 8
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22此处省略n个字符
date >/root/2013.log
#定义三分钟之后显示hello
[root@server ~]# at now + 3 minutes
-l atq的别名,可列出目前系统上面的所有该用户的at调度,查看系统任务
命令总结:
循环执行的例行性工作crond
循环执行的例行性工作:每隔一定的周期就需要执行一次
语法
crontab(选项)(参数)
选项
-e:编辑该用户的计时器设置;
-l:列出该用户的计时器设置;
-r:删除该用户的计时器设置;
-u<用户名称>:指定要设定计时器的用户名称。
crontab的工作过程
/etc/cron.allow,写在该文件的人可以使用at命令
/etc/cron.deny,黑名单
两个文件如果都不存在,只有root能使用此处提一下PATH与windows上的也是原理在path里面计算机会自动扫描这里的文件,比如说一些可执行文件touch 命令的就放在这个目录下所以可以不使用绝对路径直接使用他
crontab工作调度对应的系统服务
[root@localhost ~]# systemctl status crond
crontab工作的日志文件
[root@localhost ~]# ll /var/log/cron
用户定义计划任务的文件所在目录
[root@localhost ~]# ll /var/spool/cron/
动态查看
[root@localhost ~]# tail -f /var/log/cron
补充说明
crontab命令 被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
参数
crontab文件:指定包含待执行任务的crontab文件。
知识扩展
Linux下的任务调度分为两类: 系统任务调度 和 用户任务调度 。
系统任务调度: 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:
#run-parts ---此处的功能为将脚本每个小时、每天、每周、每个月运行一次
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/# run-parts
5 1* * * * root run-parts /etc/cron.hourly
2 4 7 * * * root run-parts /etc/cron.daily
2 2 4* * 0root run-parts /etc/cron.weekly
4 2 4 1* * root run-parts /etc/cron.monthly
前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
用户任务调度: 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,使用者权限文件如下:
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令
/var/spool/cron/所有用户crontab文件存放的目录,以用户名命名
crontab文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,
crontab文件格式
Minute hour day month week command(命令) 顺序:分 时 日 月 周
其中:
- minute: 表示分钟,可以是从0到59之间的任何整数。
- hour:表示小时,可以是从0到23之间的任何整数。
- day:表示日期,可以是从1到31之间的任何整数。
- month:表示月份,可以是从1到12之间的任何整数。
- week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
- command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
文件中的特殊字符
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
注:%在crontab里面有特殊含义,如果有命令里面需要使用%,需要使用\转义。
crond服务
/sbin/service crond start # 启动服务
/sbin/service crond stop # 关闭服务
/sbin/service crond restart # 重启服务
/sbin/service crond reload # 重新载入配置
查看crontab服务状态:
service crond status
手动启动crontab服务:
service crond start
实例
每1分钟执行一次command
* * * * * command
每小时的第3和第15分钟执行
3,15 * * * * command
在上午8点到11点的第3和第15分钟执行
3,158-11* * * command
每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command
每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command
每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
每月1、10、22日的4 : 45重启smb
45 41,10,22 * * /etc/init.d/smb restart
每周六、周日的1:10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
每星期六的晚上11:00 pm重启smb
0 23 * * 6/etc/init.d/smb restart
每一小时重启smb
* */1 * * * /etc/init.d/smb restart
晚上11点到早上7点之间,每隔一小时重启smb
* 23-7/1 * * * /etc/init.d/smb restart
每月的4号与每周一到周三的11点重启smb
0 114* mon-wed /etc/init.d/smb restart
一月一号的4点重启smb
0 411 * /etc/init.d/smb restart
每小时执行/etc/cron.hourly目录内的脚本
0 1 * * * * root run-parts /etc/cron.hourly
每次执行任务时都会将日志文件存到 /var/log/cron 下面
动态查看crontab的任务情况
tail -f /var/log/cron
可唤醒停机期间的工作任务
anacron 可以处理关机状态时未执行的计划任务,anacron不能指定何时执行某项任务,而是以天为单位或是在开机后立刻进入anacron的操作(`/etc/anacrontab`)。它会去检测停机期间应该进行但是并没有进行的crontab任务,并将该任务执行一遍,然后anacron就会自动停止了