Linux - 任务计划
目录
一次性任务计划
系统默认未安装此工具。
语法:at data_time
yum -y install atd
#光安装完不行还得启动服务
systemctl start atd #启动服务
systemctl enable atd #开机自启
systemctl status atd #查看服务状态
时间日期写法:
#绝对时间
HH:MM:具体时间点
DD.MM.YYYY:天.月.年
YYYY-MM-DD:年-月-日
MM/DD/YY:月/日/年
HH:MM YYYY-MM-DD:时:分 年-月-日
#相对时间
at now+3minutes(min也行):从任务计划创建开始计时,3分钟以后执行
选项。
- -l,显示 at 任务列表,等同于 atq。
- -d,删除指定编号 at 任务,等同于 atrm。
- -c,显示指定编号 at 任务执行的命令。
- -f,读取指定文件中任务,避免在命令行交互。
例子
[root@gbb ~]# at time
at> command #写下你要操作的命令(有多条写完直接回车继续写),ctrl+d 保存退出。
如果你发现,输错要执行的命令怎么都删不掉,可以试试 Ctrl+Backspace
。
设置 at 任务后在 /var/spool/at/
目录下目录生成一个脚本文件,用选项查看就是这里脚本文件。
计划执行结果会以 mail 发送给执行at的用户(软件包名是:mailx),直接输入 mail
命令查看邮件列表,之后可以输入 mail_id
查看指定邮件 ,查看完成后用 q 退出。
如果你发现没有邮件,那可能是 mail 服务出现了问题,可以查看一下本地环回地址 25 号端口有没监听。
at 命令不是谁都可以执行的,在 /etc 目录中有 at.allow 与 at.deny 两文件(允许与拒绝),at.allow 是除了文件中的用户外谁也不能用,at.deny 存在表示文件内的用户名被拉黑(使用方法是在文件中写上用户名重启服务就能生效),如果目录下两个文件不存在就只能 root 执行 at 命令。
batch
:CPU 空闲执行计划,负载 <0.8 才执行 batch 中的任务,uptime
查看 CPU 平均负载。直接输入 batch 后面就是你要执行的命令,貌似不能指定时间,at 够用,等需要用到时再折腾。
周期性任务计划
系统周期性任务:每隔一段时间自动执行,比如日志轮换(logrotate)、登录文件分析(logwatch)、locate 数据库更新(updatedb)、man 数据库更新(mandb/makewathis)、rpm 软件登录文件创建、网络相关分析行为,自动清空 tmp 目录。
用户周期性任务:自己每隔多长时间自动去执行某些操作。
要想任务能够成功执行需要启动服务。
systemctl start crond #启动服务
systemctl enable crond #开机自启
systemctl status crond #查看服务状态
语法:crontab options
选项。
- -e,增加或编辑一个 cron 任务内容
- -u,为指定用户设置 cron 任务计划(root 才能使用)
- -l,查看 cron 任务列表
- -r,清空整个 cron 列表。如果想删除某一条,-e 进入去删或者注释。
- -i,在清空任务时,提示是否要清清空。
它和 crontab 一样,不过设置日期的格式不同。这是说,每月 1 号零点去压缩 upload 目录内容,它格式有两种方式,如下。
- 用户设置:分 时 日 月 周 用户 命令 #指定某个用户与运行
- 系统设置:分 时 日 月 周 命令 #默认root用户
使用 -e 会自动打开一个临时文件,和编辑文本一样去操作。
[root@gbb ~]# crontab -e
00 0 1 * * zip -r /root/upload.zip /usr/local/nginx/upload
别直接编辑这个配置文件,因为它不会告诉你语法错误,别骚,除非你是神仙。另外 crontab 不像 at 给计划加上了执行命令加上了环境(at -c 中前半部分),可能部分命令在未登录情况下不能执行,建议给命令加上绝对路径(参见下文 crontab 配置文件中 PATH)。
写命令时有 %,需要对它转义,也可放入单引号中。。
具体的日期范围:
时间单位 | 范围值 |
---|---|
minute | 0 - 59 |
hour | 0 - 23 |
day of month | 1 - 31 |
month | 1 - 12 |
day of week | 0 - 6(Sunday=0 or 7) |
通配符 *
定义任意时间。
10 17 * * * cat /etc/fstab #每天下午五点十分去执行命令
10 * * * * cat /etc/fstab #每小时的第十分去执行命令,01:10,02:10,每个小时去执行。
* * * * * cat /etc/fstab #每分钟去执行
10 17 * * 0 cat /etc/fstab #每周日下午五点十分执行。
10 17 11 * * cat /etc/fstab #每月7号下午五点十分执行。
10 17 20 3 * cat /etc/fstab #每年3月20号下午五点十分执行。
逗号 ,
定义定义离散时间段。
5,15,30,45,56 17 * * * cat /etc/fstab #每天五点5,15,30,45,56来执行命令
0 15,20 * * 3,0 #每周三周日下午三点和八点整执行。
* 15,20 * * 3,0 #分钟位置*代表每分钟执行。
中横线 -
定义连续时间段。
00 23 * * 1-5 cat /etc/fstab #每周一到周五晚上十一点执行命令。
0 9-18 * * 1-5 cat /etc/fstab #每周一到周五9-18每小时执行。
*/n
定义间隔时间段。其中 n 是步长。
*/5 * * * * cat /etc/fstab #每五分钟执行
00 10 */5 * * cat /etc/fstab #每隔五天的十点整执行
*/7 * * * * cat /etc/fstab #每7分钟执行?当步长不能被整除,这个计划就不会执行。
指定日期时 day of week 和 day of month 最好不要一起用,因为无法保证那一天一定是周几。
配置文件
文件 | 解释 |
---|---|
/var/spool/cron | 用户cron任务计划配置文件 |
/etc/crontab | cron配置文件 |
/etc/cron.allow | 允许哪些用户使用此命令 |
/etc/cron.deny | 拒绝哪些用户使用此命令(默认存在) |
/etc/cron.d | cron辅助配置文件目录 |
Linux 用户设置完 cron 任务后,会在 /var/spool/cron 目录下生成和用户同名的 cron 文件。执行成功后会发一封 Email 到用户中,要是执行任务比较频繁每次发送邮件会充满屏幕,这时可以把成功结果重定向到 /dev/null
,做法是在要执行命令后面加上 command > dev/null
。
/etc/crontab
SHELL=/bin/bash #用什么shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #corntab执行命令去哪个目录中找
MAILTO=root #收取邮件的用户
# For details see man 4 crontabs #查看更多细节用 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 #user-name是系统用户可以指定一个用户,command to be executed 是你要执行的命令。
/etc/cron.d
目录内 0hourly 文件内容是每小时执行的任务。
/etc/cron.hourly:cron工具去执行
/etc/cron.daily,/etc/cron.weekly,cron.monthly 是 anacron 工具去执行
anacron
当 cron 任务异常未执行,anacron 会重新去执行 cron 任务。
语法:anacron [options] [job]
选项。
- -s,依据时间记录文件去判断是否执行
- -f,强制执行
- -n,立刻运行未执行的任务,不需要延时
anacrontab 配置文件
对 /etc/anacrontab 配置文件解释。
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh #使用的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #命令的位置
MAILTO=root #执行成功mail发给谁
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45 #随机延迟(分钟)
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22 #开始延迟范围(小时)
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
对配置文件其中一句进行解释。
这一段的意思是,一天内没执行,5 分钟后立马执行后面的命令。1 是日期,5 是延迟几分钟去执行(要加上 anacrontab 配置文件中随机延迟范围的 3—22 小时),cron.daily 标明了是什么类型的任务,这一句是以天为单位的任务,nice run-parts /etc/cron.daily 是将要执行的命令,其中 nice 是用于提高 cron.daily 下脚运行优先级。
1 5 cron.daily nice run-parts /etc/cron.daily
anacron 执行流程还没弄懂。
- 由 /etc/anacrontab 分析到 cron.daily 天数为 1 天。
- 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 时间戳。
- 由 2 步骤分析出的时间戳和 cron 任务进行比较,查看哪些 cron 任务超过 1 天时间没有执行。
- 根据 /etc/anacrontab 设置延迟执行。
- 延时时间到执行。
最近更新:
发布时间: