一、一次性定时任务 at

查看服务是否已安装 systemctl list-dependencies atd

  1. $ systemctl list-dependencies atd
  2. atd.service
  3. ├─system.slice
  4. └─basic.target
  5. ├─microcode.service
  6. ├─rhel-dmesg.service
  7. ├─selinux-policy-migrate-local-changes@targeted.service
  8. ├─paths.target
  9. ├─slices.target
  10. ├─-.slice

查看服务状态 service atd status

  1. $ service atd status
  2. Redirecting to /bin/systemctl status atd.service
  3. atd.service - Job spooling tools
  4. Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
  5. Active: active (running) since Mon 2020-10-12 11:55:58 CST; 2 weeks 5 days ago
  6. Main PID: 502 (atd)
  7. CGroup: /system.slice/atd.service
  8. └─502 /usr/sbin/atd -f
  9. 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 天之后的此时此刻执行。
  1. $ pwd
  2. /www/test_at
  3. # 创建 shell 脚本,该脚本会输出 hello 到 /www/test_at/task.log
  4. $ cat ./task.sh
  5. #!/bin/bash
  6. echo hello\n >> /www/test_at/task.log
  7. # 创建一个定时任务于一分钟后执行
  8. $ at now+1 minute
  9. # 运行创建好的 shell 脚本,将输出保存到 /www/test_at/at.log
  10. at> /www/test_at/task.sh >> /www/test_at/at.log
  11. # 按 control + D 保存
  12. at> <EOT>
  13. # 提示该任务的执行时间
  14. job 7 at Fri Nov 6 23:14:00 2020
  15. # 查看任务列表
  16. $ atq
  17. 7 Fri Nov 6 23:14:00 2020 a root
  18. # 一分钟后看到输出文件
  19. $ ls /www/test_at
  20. at.log task.log task.sh
  21. $ cat task.log
  22. hello

二、循环执行定时任务 crontab

查看服务是否已安装启动

  1. $ service atd status
  2. Redirecting to /bin/systemctl status atd.service
  3. atd.service - Job spooling tools
  4. Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
  5. Active: active (running) since Mon 2020-10-12 11:55:58 CST; 3 weeks 4 days ago
  6. Main PID: 502 (atd)
  7. CGroup: /system.slice/atd.service
  8. └─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 分都会执行命令,注意:星期几和几日最好不要同时出现,因为它们定义的都是天,非常容易让管理员混淆

例:

  1. $ crontab -e
  2. # 进入编辑界面,每过一分钟将系统时间记录到 log 文件
  3. */1 * * * * /bin/date >> /www/test_crontab/crontab.log
  4. # 保存退出
  5. :wq
  6. # 可以看到时间输出到 log 文件
  7. $ tail -f /www/test_crontab/crontab.log
  8. Sat Nov 7 10:13:01 CST 2020
  9. Sat Nov 7 10:14:01 CST 2020

参考 http://c.biancheng.net/view/1092.html