Linux定时执行任务
一、at命令
1、at命令的准备工作
1)安装 at 软件包
[root@centos7 ~]# yum install -y at
2)需要 atd 服务的支持。atd 服务是独立的服务
查看atd服务状态:# systemctl status atd
开启atd服务:# systemctl start atd
关闭atd服务:# systemctl stop atd
3)查看是否开始开机启动服务:如果弹出enabled,说明开机启动此服务
[root@rocky ~]# systemctl is-enabled atd
enabled
[root@rocky ~]#
4)安装好 at 软件包并开启 atd 服务之后,at 命令才可以正常使用。
[root@rocky ~]# systemctl start atd
[root@rocky ~]# systemctl status atd
2、at 命令的访问控制
访问控制:是指允许哪些用户使用 at 命令设定定时任务,或者不允许哪些用户使用 at 命令。可以将其想象成设定黑名单或白名单。at 命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,具体规则如下:
-
1)如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令((注意,/etc/at.allow 文件的优先级更高,也就是说,如果同一个用户既写入 /etc/at.allow 文件,又写入 /etc/at.deny 文件,那么这个用户是可以使用 at 命令的);
-
2)如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件(黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效;
-
3)如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令;
-
4)系统中默认只有 /etc/at.deny 文件,而且这个文件是空的,因此,系统中所有的用户都可以使用 at 命令。如果我们打算控制用户的 at 命令权限,那么只需把用户名写入 /etc/at.deny 文件即可。
3、at 命令语法添加定时执行任务
基本格式
at [选项] [时间] or at [option] TIME
选项
-V 显示版本信息
-t time 时间格式 [[CC]YY]MMDDhhmm[.ss]
-l 列出指定队列中等待运行的作业;相当于atq
-d N 删除指定的N号作业;相当于atrm
-c N 查看具体作业N号任务
-f file 指定的文件中读取任务
-m 当任务被完成之后,将给用户发送邮件,即使没有标准输出
注意:
- 作业执行命令的结果中的标准输出和错误以执行任务的用户身份发邮件通知给 root
- 默认CentOS 8 最小化安装没有安装邮件服务,需要自行安装
- TIME:定义出什么时候进行 at 这项任务的时间
此命令中关于时间参数可用的以下格式:
格式 | 用法 |
---|---|
HH:MM | 比如 04:00 AM。 |
Midnight(midnight) | 代表 12:00 AM |
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 天之后的此时此刻执行。 |
具体的使用方法: |
at命令后想要输入执行程序的确切时间,然后回车,接着在 > 后输入想要执行的命令,最后用 Ctrl+d 组合键退出 at 命令。
范例
[root@centos7 ~]# at now+2 min
at> ls ./ > a.log
范例: ubuntu at任务存放路径
root@ubuntu200404-1:~# ll /var/spool/cron/
total 20
drwxr-xr-x 5 root root 4096 Feb 23 2022 ./
drwxr-xr-x 4 root root 4096 Feb 23 2022 ../
drwxrwx--T 2 daemon daemon 4096 Sep 6 13:32 atjobs/
drwxrwx--T 2 daemon daemon 4096 Nov 12 2018 atspool/
drwx-wx--T 2 root crontab 4096 Feb 13 2020 crontabs/
root@ubuntu200404-1:~# ll /var/spool/cron/atjobs/
total 16
drwxrwx--T 2 daemon daemon 4096 Sep 6 13:32 ./
drwxr-xr-x 5 root root 4096 Feb 23 2022 ../
-rwx------ 1 root daemon 2838 Sep 6 13:33 a0000101a6c9d1*
-rw------- 1 daemon daemon 6 Sep 6 13:32 .SEQ
root@ubuntu200404-1:~#
范例:centos at任务存放路径
[root@centos7 ~]# ll /var/spool/at/
total 4
-rwx------. 1 root root 2831 Sep 6 21:37 a0000501a6c9d5
drwx------. 2 root root 19 Sep 6 21:31 spool
[root@centos7 ~]#
二、 crontab命令
at 命令:是在指定的时间只能执行一次任务。 crontab 命令:可以循环重复的执行定时任务。
1、crontab 命令的准备工作
crontab 命令需要 crond 服务支持。crond 是 Linux 下用来周期地执行某种任务或等待处理某些事件的一个守护进程,在安装完成操作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的。crond 进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务。
crontab 命令和 at 命令类似,也是通过 /etc/cron.allow 和 /etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。
启动crond服务之后才能使用crontab 命令:
# systemctl start crond 或者 # systemctl enable crond
2、 crontab 命令语法
命令格式
crontab [-u user] [-l | -r | -e] [-i]
常用选项
-l 列出所有任务
-e 编辑任务
-r 移除所有任务
-i 同-r一同使用,以交互式模式移除指定任务
-u user 指定用户管理cron任务,仅root可运行
crontab 定时任务非常简单,只需执“crontab -e”命令,然后输入想要定时执行的任务即可。注意文件格式如下:
[root@centos7 ~]## crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
* * * * * 执行的任务
/etc/crontab 格式说明,详情参见 man 5 crontab
注释行以 # 开头
[root@centos7 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
You have mail in /var/spool/mail/root
[root@centos7 ~]#
项目 | 含义 | 范围 |
---|---|---|
第一个"*" | 一小时当中的第几分钟(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 服务是启动的。
这里举几个时间的例子来熟悉一下时间字段(星期几和几日最好不要同时出现,非常容易让管理员混淆)
1 2 * * * 在每天凌晨 2 点 1 分执行命令
0 17 * * 1| 在每周一的 17 点 0 分执行命令
0 5 1,15 * * | 在每月 1 日和 15 日的凌晨 5 点 0 分执行命令
40 4 * * 1-5| 在每周一到周五的凌晨 4 点 40 分执行命令
*/10 4 * * *| 在每天的凌晨 4 点,每隔 10 分钟执行命令
3,15 8-11 */2 * *| 在每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟执行命令
评论区