一、一次性定时任务 at
查看服务是否已安装 systemctl list-dependencies atd:
$ systemctl list-dependencies atdatd.service● ├─system.slice● └─basic.target● ├─microcode.service● ├─rhel-dmesg.service● ├─selinux-policy-migrate-local-changes@targeted.service● ├─paths.target● ├─slices.target● │ ├─-.slice
查看服务状态 service atd status:
$ service atd statusRedirecting to /bin/systemctl status atd.service● atd.service - Job spooling toolsLoaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)Active: active (running) since Mon 2020-10-12 11:55:58 CST; 2 weeks 5 days agoMain PID: 502 (atd)CGroup: /system.slice/atd.service└─502 /usr/sbin/atd -fOct 12 11:55:58 iZwz91sneajs2ji49vo4wxZ systemd[1]: Started Job spooling tools.
at 命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,具体规则如下:
- 如果系统中有 
/etc/at.allow文件,那么只有写入/etc/at.allow文件(白名单)中的用户可以使用at命令,其他用户不能使用at命令(注意,/etc/at.allow文件的优先级更高,也就是说,如果同一个用户既写入/etc/at.allow文件,又写入/etc/at.deny文件,那么这个用户是可以使用at命令的)。 - 如果系统中没有 
/etc/at.allow文件,只有/etc/at.deny文件,那么写入/etc/at.deny文件(黑名单)中的用户不能使用at命令,其他用户可以使用at命令。不过这个文件对root用户不生效。 - 如果系统中这两个文件都不存在,那么只有 
root用户可以使用at命令。 
at 服务一定要启动了才可以使用
小科普:为什么
at服务的名称叫atd? 字母 d 是英文 daemon 守护进程的意思,像 mysql,http 等服务都需要在后台运行,所以他们都有一个守护进程 mysqld、httpd
at [选项] [时间]at 命令选项及含义:
| 选项 | 含义 | 
|---|---|
| -m | 当 at 工作完成后,无论命令是否输出,都用 E-mail 通知执行 at 命令的用户。 | 
| -c <工作标识号> | 显示该 at 工作的实际内容。 | 
| -t <时间> | 在指定时间提交工作并执行,时间格式为 [[CC]YY]MMDDhhmm。 | 
| -d | 删除某个工作,需要提供相应的工作标识号(ID),同 atrm 命令的作用相同。 | 
| -l | 列出当前所有等待运行的工作,和 atq 命令具有相同的额作用。 | 
| -f <脚本文件> | 指定所要提交的脚本文件。 | 
at 命令时间参数可用格式:
| 格式 | 用法 | 
|---|---|
| HH:MM | 比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。 | 
| Midnight(midnight) | 代表 12:00 AM(也就是 00:00)。 | 
| Noon(noon) | 代表 12:00 PM(相当于 12:00)。 | 
| Teatime(teatime) | 代表 4:00 PM(相当于 16:00)。 | 
| 英文月名 日期 年份 | 比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。 | 
| MMDDYY、MM/DD/YY、MM.DD.YY | 比如 011518 表示 2018 年 1 月 15 号。 | 
| now+时间 | 以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行。 | 
$ pwd/www/test_at# 创建 shell 脚本,该脚本会输出 hello 到 /www/test_at/task.log$ cat ./task.sh#!/bin/bashecho hello\n >> /www/test_at/task.log# 创建一个定时任务于一分钟后执行$ at now+1 minute# 运行创建好的 shell 脚本,将输出保存到 /www/test_at/at.logat> /www/test_at/task.sh >> /www/test_at/at.log# 按 control + D 保存at> <EOT># 提示该任务的执行时间job 7 at Fri Nov 6 23:14:00 2020# 查看任务列表$ atq7 Fri Nov 6 23:14:00 2020 a root# 一分钟后看到输出文件$ ls /www/test_atat.log task.log task.sh$ cat task.loghello
二、循环执行定时任务 crontab
查看服务是否已安装启动
$ service atd statusRedirecting to /bin/systemctl status atd.service● atd.service - Job spooling toolsLoaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)Active: active (running) since Mon 2020-10-12 11:55:58 CST; 3 weeks 4 days agoMain PID: 502 (atd)CGroup: /system.slice/atd.service└─502 /usr/sbin/atd -f
该命令和 at 命令类似,也是通过 /etc/cron.allow 和 /etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似:
- 当系统中有 
/etc/cron.allow文件时,只有写入此文件的用户可以使用crontab命令,没有写入的用户不能使用crontab命令。同样,如果有此文件,/etc/cron.deny文件会被忽略,因为/etc/cron.allow文件的优先级更高。 - 当系统中只有 
/etc/cron.deny文件时,写入此文件的用户不能使用crontab命令,没有写入文件的用户可以使用crontab命令。 - 这个规则基本和 
at命令的规则一致,同样是/etc/cron.allow文件比/etc/cron.deny文件的优先级高,Linux 系统中默认只有/etc/cron.deny文件。 
crontab [选项] [file]:这里的 file 指的是命令文件的名字,表示将 file 作为 crontab 的任务列表文件并载入 crontab,若在命令行中未指定文件名,则此命令将接受标准输入(键盘)上键入的命令,并将它们键入 crontab。
crontab 命令常用选项及功能:
| 选项 | 功能 | 
|---|---|
| -u user | 用来设定某个用户的 crontab 服务,例如 “-u demo” 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。 | 
| -e | 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。 | 
| -l | 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。 | 
| -r | 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。 | 
| -i | 在删除用户的 crontab 文件时,给确认提示。 | 
crontab 时间表示
| 项目 | 含义 | 范围 | 
|---|---|---|
| 第一个”*” | 一小时当中的第几分钟(minute) | 0~59 | 
| 第二个”*” | 一天当中的第几小时(hour) | 0~23 | 
| 第三个”*” | 一个月当中的第几天(day) | 1~31 | 
| 第四个”*” | 一年当中的第几个月(month) | 1~12 | 
| 第五个”*” | 一周当中的星期几(week) | 0~7(0和7都代表星期日 | 
时间特殊符号
| 特殊符号 | 含义 | 
|---|---|
| *(星号) | 代表任何时间。比如第一个”*”就代表一小时种每分钟都执行一次的意思。 | 
| ,(逗号) | 代表不连续的时间。比如”0 8,12,16*命令”就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 | 
| -(中杠) | 代表连续的时间范围。比如”0 5 ** 1-6命令”,代表在周一到周六的凌晨 5 点 0 分执行命令。 | 
| /(正斜线) | 代表每隔多久执行一次。比如*/10 * * * *,代表每隔 10 分钟就执行一次命令。  | 
当“crontab -e”编辑完成之后,一旦保存退出,那么这个定时任务实际就会写入 /var/spool/cron/ 目录中,每个用户的定时任务用自己的用户名进行区分。而且 crontab 命令只要保存就会生效,只要 crond 服务是启动的。
| 时间 | 含义 | 
|---|---|
| 45 22 *命令 | 在 22 点 45 分执行命令 | 
| 0 17 ** 1命令 | 在每周一的 17 点 0 分执行命令 | 
| 0 5 1,15**命令 | 在每月 1 日和 15 日的凌晨 5 点 0 分执行命令 | 
| 40 4 ** 1-5命令 | 在每周一到周五的凌晨 4 点 40 分执行命令 | 
| */10 4 命令 | 在每天的凌晨 4 点,每隔 10 分钟执行一次命令 | 
| 0 0 1,15 * 1命令 | 在每月 1 日和 15 日,每周一个 0 点 0 分都会执行命令,注意:星期几和几日最好不要同时出现,因为它们定义的都是天,非常容易让管理员混淆 | 
例:
$ crontab -e# 进入编辑界面,每过一分钟将系统时间记录到 log 文件*/1 * * * * /bin/date >> /www/test_crontab/crontab.log# 保存退出:wq# 可以看到时间输出到 log 文件$ tail -f /www/test_crontab/crontab.logSat Nov 7 10:13:01 CST 2020Sat Nov 7 10:14:01 CST 2020
