定时任务(cron与at)

  1. 1. cron(定时任务)
    1. 1.1. 常用命令
    2. 1.2. cronjob 格式
      1. 1.2.1. 例1:
      2. 1.2.2. 例2:
      3. 1.2.3. 例3:
    3. 1.3. cron的权限管理
  2. 2. at命令
    1. 2.1. 选项
    2. 2.2. 常用的时间格式:
      1. 2.2.1. 例1:
    3. 2.3. 权限控制

cron(定时任务)

cron是最常用的定时任务类型,用于执行周期性计划

对应的服务为crond,使用前请确保此服务已运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-05-21 14:24:24 CST; 1 months 8 days ago
Main PID: 19808 (crond)
Tasks: 1
Memory: 1.4M
CGroup: /system.slice/crond.service
└─19808 /usr/sbin/crond -n

May 21 14:24:24 VM-0-9-centos systemd[1]: Stopped Command Scheduler.
May 21 14:24:24 VM-0-9-centos systemd[1]: Started Command Scheduler.
May 21 14:24:24 VM-0-9-centos crond[19808]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 24% if used.)
May 21 14:24:24 VM-0-9-centos crond[19808]: (CRON) INFO (running with inotify support)
May 21 14:24:24 VM-0-9-centos crond[19808]: (CRON) INFO (@reboot jobs will be run at computer's startup.)

常用命令

crontab -e 使用vi文本编辑器编辑cronjob,可通过-u指定用户执行。

crontab -l 列出所有cronjob:

1
2
 crontab -l
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'

crontab -r 删除用户的cronjob

cronjob 格式

1
* * * * *  expr

前五个*分别代表 分、时、日、月、周,最后一列是需要执行的命令。

使用L 可代表本月最后一天/本周最后一天:

e.g:

在天(月)子表达式中,“L”表示一个月的最后一天
在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT
6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五
在使用“L”参数时,不要指定列表或范围,因为这会导致问题

例1:

需要在每周五晚上三点钟执行 /root/dump.sh 脚本

1
0 3 0 0 5 /root/dump.sh

例2:

需要在每月10号执行 /root/dump.sh脚本

1
0 0 0 10 0 /root/dump.sh

例3:

在每月月底最后一天执行 /root/dump.sh脚本

1
0 0 L * * /root/dump.sh

cron的权限管理

/etc/cron.deny文件为cron的黑名单,在此名单中的用户无法执行cron

另外/etc/cron.allow默认不存在,为白名单,若手动创建,则黑名单失效,除白名单外的用户无法执行cron

at命令

与周期性任务cron不同,at命令用于执行在某一时间只执行一次的一次性任务。

使用方法:

at + 选项 + 时间参数

选项

1
2
3
4
at -f  $FILE_NAME     #指定执行的脚本文件
at -l #列出当前延时任务
at -r $JOB_ID #删除指定延时任务
at -c $JOB_ID #列出任务详细信息

常用的时间格式:

<时>:<分> <年>-<月>-<日>

<时>:<分>

MMDDYY

MM/DD/YY

MM.DD.YY

英文月名 日期 年份

各种简写:

Midnight(00:00)

Noon(12:00)

Teatime(16:00),

now+time(从现在起的某段时间后执行)

例1:

五分钟后执行a.sh

1
2
at -f a.sh  now+5min
job 3 at Tue Jun 29 20:51:00 2021

写法2:

1
2
3
4
 at now+5min
at> /root/a.sh
at> <EOT>
job 4 at Tue Jun 29 20:52:00 2021 # 使用Ctrl + D 结束

权限控制

同cron, 文件名/etc/at.deny/etc/at.allow