一、一次性定时任务 at
查看服务是否已安装 systemctl list-dependencies atd
:
$ systemctl list-dependencies atd
atd.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 status
Redirecting to /bin/systemctl status atd.service
● atd.service - Job spooling tools
Loaded: 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 ago
Main PID: 502 (atd)
CGroup: /system.slice/atd.service
└─502 /usr/sbin/atd -f
Oct 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/bash
echo hello\n >> /www/test_at/task.log
# 创建一个定时任务于一分钟后执行
$ at now+1 minute
# 运行创建好的 shell 脚本,将输出保存到 /www/test_at/at.log
at> /www/test_at/task.sh >> /www/test_at/at.log
# 按 control + D 保存
at> <EOT>
# 提示该任务的执行时间
job 7 at Fri Nov 6 23:14:00 2020
# 查看任务列表
$ atq
7 Fri Nov 6 23:14:00 2020 a root
# 一分钟后看到输出文件
$ ls /www/test_at
at.log task.log task.sh
$ cat task.log
hello
二、循环执行定时任务 crontab
查看服务是否已安装启动
$ service atd status
Redirecting to /bin/systemctl status atd.service
● atd.service - Job spooling tools
Loaded: 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 ago
Main 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.log
Sat Nov 7 10:13:01 CST 2020
Sat Nov 7 10:14:01 CST 2020