侧边栏壁纸
博主头像
运维匠-运维工程师知识分享经验和最佳实践博主等级

生活百般滋味,人生需要笑对

  • 累计撰写 60 篇文章
  • 累计创建 3 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux定时执行任务

运维匠
2022-09-05 / 0 评论 / 0 点赞 / 8 阅读 / 7822 字
温馨提示:
本文最后更新于 2024-07-15,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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

1662393874290

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 分钟执行命令

img

0

评论区