Linux例行工作排程(at,crontab 定时任务执行)
一、Linux例行工作排程
Linux例行工作排程即指在Linux中定时的运行任务,通常分为两类:只执行一次的定时任务和循环执行的定时任务。
1. 循环执行的定时任务(crontab)
crontab
:crontab 这个指令所设定的工作将会循环的一直执行下去!可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,也可编辑 /etc/crontab 来支持。 让 crontab 可以生效的服务则是 crond 这个服务。
1.2. 创建循环定时任务:
可以通过指令和系统配置文件两种方式来创建循环执行的工作任务。
1.2.1. 通过指令:crontab -e
执行此命令之后会进入vi编辑界面,可以使用vi编辑器相关命令进行编辑定时任务,每行表示一个任务。实际上此命令是编辑文件/var/spool/cron/用户名
,例如用户frank使用此命令编辑并保存任务后,所有任务将会被写进/var/spool/cron/frank
这个文件中。
编辑格式要求:每一行代表一个任务,每个字段之间使用空格分隔,这里一共6个字段。分别代表的意义是分钟、小时、日期、月份、周、指令。
#任务的格式
#例:每晚23点10分,23点20分执行/home/frank/test.sh脚本
10,20 23 * * * /homefrank/test.sh
下面是对应各个字段的意义和取值范围:
分钟 | 小时 | 日期 | 月份 | 周 | 指令 |
---|---|---|---|---|---|
0 - 59 | 0 - 23 | 1 - 31 | 1 - 12 | 0 - 7 | 指令 |
注意:周(第5个字段)——取值 0或7 都代表星期天
一些匹配字符的含义:
特殊字符 | 代表意义 |
---|---|
* (星号) | 代表任何时刻都接受,即匹配所有取值 例: 0 12 * * * command 表示不论何月、何日的礼拜几的12:00执行 |
, (逗号) | 代表分隔时段的意思,即用逗号分隔的值都匹配 例: 10,20 23 * * * command 表示不论何月、何日的礼拜几的23:10 和 23:20执行 |
- (减号) | 代表一段时间范围内,但是只能取整数 例: 20 8-12 * * * command 里面的8-12代表 8,9,10,11,12都匹配 |
/n (斜线) | n 代表数字,亦即是『每隔 n 单位间隔』的意思 例: * */1 * * * command 表示每隔1小时执行 |
1.2.2. 通过编辑系统配置文件:/etc/crontab
第二种创建排程任务方式通过编辑系统配置文件:/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
# 分 时 日 月 周 执行者用户 需执行的命令
#
#例子:每隔1小时以用户frank的身份执行一次/home/frank/test.sh脚本
* */1 * * * frank /home/frank/test.sh
使用系统配置文件编辑任务时需要多写一个字段即执行者用户。因为使用crontab -e
时执行者用户即为当前用户。也可以使用crontab -u username -e
来指定为某个用户建立或移除工作任务。
1.3. 显示定时任务
使用命令crontab -l
可以查阅使用者目前的工作任务。
1.4. 移除定时任务
移除某一项工作任务应该再次使用crontab -e
指令来编辑删在这里插入代码片除。
移除当前使用者所有的任务使用crontab -r
指令。
1.5. 限制能使用crontab指令的用户
为了安全性可以限制能使用crontab指令的用户:
- 文件/etc/cron.allow中所记录的用户可以使用crontab指令,若未记录则不可以使用;
- 文件/etc/cron.deny中所记录的用户不可使用crontab命令,若未记录则可以使用。
生效文件的选择优先级:/etc/cron.allow 比 /etc/cron.deny 的优先级高。建议保存其中一个文件即可。系统默认保留的是/etc/cron.deny文件。
文件的格式:一个账号写一行。
2. 执行一次的定时任务(at)
at
:at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务
2.1. 创建一次性任务
使用命令at TIME
会进入一个 at shell 的环境来让用户下达工作指令。
TIME:时间格式,这里可以定义出『什么时候要进行 at 这项工作』的时间,格
式有:
- HH:MM
例: at 04:00
在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。 - HH:MM YYYY-MM-DD
例: 04:00 2019-03-17
强制规定在某年某月的某一天的特殊时刻进行该工作! - HH:MM[am|pm] [Month] [Date]
例: 04:00pm March 19
也是一样,强制在某年某月某日的某时刻进行行! - HH:MM[am|pm] + number [minutes|hours|days|weeks]
例:now + 5 minutes
或04:00pm + 3 days
就是说,在某个时间点『再加几个时间后』才进行。
使用 at 这个指令来产生所要运作的工作会以文本文件的方式写入 /var/spool/at/ 目录下。
2.2. 显示任务
at -l
:at -l 相当于 atq,列出目前系统上面的所有该用户的 at 排程。
at -v
:可以使用较明显的时间格式栏出 at 排程中的任务栏表。
at -c
:可以列出后面接的该项工作的实际指令内容
2.3. 移除任务
at -d
:at -d 相当于 atrm,可以取消一个在 at 排程中的工作;
需要先使用查询at工作排程命令 at -l
或 atq
显示所有排程,再根据显示的第一列的jobnumber使用 atrm [jobnumber]
命令来取消该任务。
2.4. 命令使用限制
也有两个文件分别为/etc/at.allow和/etc/at.deny,其意义和crontab的文件意义一致。
当两个文件都不存在时,只有root用户可以使用。