定时任务

访问控制

at 的访问控制是依靠/etc/at.allow 文件(白名单)和/etc/at.deny 文件(黑名单)这两个文件来实现的.

系统中默认时只有/etc/at.deny 文件,而且这个文件是空的/etc/at.allow 文件的权限更高,如果/etc/at.allow 文件存在,则/etc/at.deny 文件失效。

如果系统中有/etc/at.allow 文件,那么只有写入/etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令(/etc/at.deny 文件会被忽略,也就是说同一个用户既写入/etc/at.allow 文件,也写入/etc/at.deny 文件,那么这个用户是可以使用 at命令的,因为/etc/at.allow 文件优先级更高。)。

如果系统中没有/etc/at.allow 文件,只有/etc/at.deny 文件,那么写入/etc/at.deny 文件(黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root用户不生效。

如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令。

at命令 ★

定时执行一次命令

  1. at [选项] 时间

选项:

  1. -m at 工作完成后,无论是否命令有输出,都用 email 通知执行 at命令的用户
  2. -c 工作号: 显示该 at 工作的实际内容

时间:

  1. at 支持的时间格式如下:
  2. HH:MM 在指定的“小时:分钟”执行命令,例如:02:30
  3. HH:MM YYYY-MM-DD 在指定的“小时:分钟 年-月-日”执行,例如 02:30 2018-07-25
  4. HH:MM[am|pm] [month] [date] 在指定的`小时:分钟[上午|下午][月][日]`执行,
  5. 例如 02:30 July 25

HH:MM[am|pm] + [minutes|hours|days|weeks] 在指定的时间“再加多久执行”,例

  1. now + 5 minutes05am +2 hours

示例1:

  1. vim /root/hello.sh #创建脚本
  2. $ at now +2 minutes
  3. at> /root/hello.sh >> /root/hello.log #在2分钟后,执行脚本,将日志打印进文件
  4. at> <EOF> #ctrl+d 保存并进行
  5. #会提示脚本运行时间

尚硅谷笔记-定时任务 - 图1

示例2:

  1. at -c 1 #查看第1个at任务的内容

示例3:

  1. at 02:00 2022-01-16
  2. at> /bin/sync
  3. at> /sbin/shutdown -h now
  4. at> <EOT>
  5. #在2022年1月16日2点执行关机命令

其他的at命令:

  1. atq #查询当前服务器上的at工作
  2. atrm 2 #删除2号at任务

crontab ★

循环执行定时任务

启动crond服务

  1. service crond restart #重启crond服务
  2. chkconfig crond on #设定crond服务为开机自启

crontab 命令和 at 命令类似,也是通过/etc/cron.allow 和/etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似:

  1. 当系统中有/etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样如果有此文件,/etc/cron.deny 文件会被忽略,/etc/cron.allow 文件的优先级更高。
  2. 当系统中只有/etc/cron.deny 文件时,则写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。这个规则基本和 at 的规则一直,同样/etc/cron.allow 文件的优先级比/etc/cron.deny 文件的优先级高,Linux 中默认只有/etc/cron.deny 文件。

用户的crontab设置

  1. crontab -e #编辑定时任务

选项:

  1. -e 编辑 crontab 定时任务
  2. -l 查询 crontab 任务
  3. -r 删除当前用户所有的 crontab 任务,如果有多个任务,只想删除一个,可以所以用“crontab -e
  4. -u 用户名: 修改或删除其他用户的 crontab 任务。只有 root 可用

尚硅谷笔记-定时任务 - 图2

尚硅谷笔记-定时任务 - 图3

尚硅谷笔记-定时任务 - 图4

举例:

  1. crontab -e #进入编辑界面
  2. */1 * * * * /bin/echo "11" >> /tmp/test #每5分钟执行一次命令
  3. 15 3 10 * * date >> /tmp/time #每个月的第10天3点15分执行命令
  4. 55 15 5,10,15,20,25 * * shutdown -n now #每个月的5的倍数号15点55分关机

crontab 的注意事项

在书写 crontab 定时任务时,需要注意几个注意事项,这里我们再强调下:

  1. 六个选项都不能为空,必须填写。如果不确定使用“*”代表任意时间;
  2. crontab 定时任务,最小有效时间是分钟,最大时间范围是月。像 2018 年某时执行,3 30,分 30 秒这样的时间都不能识别;
  3. 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都是以天作为单位,非常容易让管理员混乱;

在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都是用绝对路径有时相对路径的命令会报错

contab设置定时命令的三种方法

方法一:

将需要定时执行的文件写成脚本,复制到/etc/cron.{daily,weekly,monthly}目录中的其中一个。系统就会根据文件夹名称,定时执行脚本。

方法二:

修改/etc/crontab 这个配置文件,按照注释的格式添加自己需要的定时任务,并且可以指定脚本的执行者身份。

尚硅谷笔记-定时任务 - 图5

每10分钟,使用root用户权限,执行data.sh脚本 位置在/root/data

方法三:

使用crontab -e 命令手动添加。唯一缺点是不能指定用户权限,哪个用户添加就是哪个用户的权限。

anacron

  1. anacron 会使用一天,七天,一个月作为检测周期,用来判断是否有定时任务在关机之后没有执行,如果有这样的任务,anacron 会在特定的时间重新执行这些定时任务。
  2. 那么 anacron 是如何判断这些定时任务已经超过了执行时间呢?在系统的 /var/spool/anacron/ 目录中存在cron.{daily,weekly,monthly}文件,**这些文件中都保存着 anacron 上次执行时的时间**。anacron 会去读取这些文件中的时间,然后和当前时间做比较,若果两个时间的差值超过了 anacron 的指定时间差值(一般是 1 天,7 天和一个月),就说明有定时任务漏掉了没有被执行,这时 anacron 会介入而执行这个漏掉的定时任务,从而保证在关机时没有被执行的定时任务不会被漏掉。
  3. CentOS 6.x 中,我们使用 cronie-anacron 取代了 *vixie-cron 软件包。而且在原先的 CentOS**版本中/etc/**cron.{daily,weekly,monthly}这些目录中的定时任务会同时被 cron 和 anacron 调用,这样非常容易出现重复执行同一个定时任 务的错误。在现在的 CentOS 6.x 中 _/etc/_cron.{daily,weekly,monthly}目录中的定时任务程序只会被 anacron 调用,从而保证这些定时任务只会在每天、每周或每月被定时执行一次,而不会重复执行。
  4. 在 CentOS 6.x 中 anacron 还有一个变化,anacron 不再是单独的服务,而变成了系统命令。也就是说我们不再可以使用“service anacron restart”命令来管理anacron服务了。而是需要使用anacron命令来管理 anacron 工作,
  1. anacron [选项] [工作名]

选项:

  1. -s: 开始anacron工作,依据/etc/anacrontab文件中的设定的延迟时间执行
  2. -n: 立即执行/etc/anacrontab中所有工作,忽略所有的延迟时间
  3. -u: 更新/var/spool/anacron/cron.{daily,weekly,monthly}文件中的时间戳,但不执行任何工作
  4. 在我们工作时,不需要执行任何anacron命令,只需要配置好/etc/anacrontab文件,系统就会依赖这个文件中的设定来通过anacron执行定时任务。

尚硅谷笔记-定时任务 - 图6

尚硅谷笔记-定时任务 - 图7

尚硅谷笔记-定时任务 - 图8