Linux | 定时任务
Linux | 定时任务
有时候因为业务需要,服务白天不能停机,但是还需要更新服务,所以只能等到凌晨两点的时候去运行脚本,去更新服务。所以这个时候定时任务就有用处了,可以写一个脚本,在指定的时间段,启动或者停止某个服务,这就实现了简单的服务器自动化运维。
定时任务分为一次性定时任务 & 周期性定时任务:
- 一次性定时任务:今天晚上的 2:30 执行 test.sh脚本。
- 周期性定时任务:每天晚上的 2:30 都执行test.sh脚本。
一次性定时任务
顾名思意,一次性定时任务只执行一次,一般用于临时的工作需要。
格式:
# 第一种方法
at 时间
> 输入要执行的内容。
# 第二种方法
要执行的命令 | at 时间
以上两种方法都行
我经常用的还是第二种,因为只需要一行就可以搞定一个简单的一次性定时任务。
例如:
echo "hello world" | at 14:25
这种方法,可以以非交互式的方式创建一个Linux任务。
可以使用at -l
命令查询创建的所有一次性定时任务:
像上面一样,我一不小心,在 15:00 的时候,创建了两个任务,这时,我可以用:atrm 定时任务的序列号
删除任务。
周期性定时任务
检查 crontab 服务是否安装
rpm -qa | grep crontab
因为这个软件是系统默认自带的,所以大部分系统都会有这个应用。如果没有,请使用: yum -y install crontab
进行安装。
检查 crontab 服务是否开启
/etc/init.d/crond start # 启动服务
/etc/init.d/crond stop # 关闭服务
/etc/init.d/crond restart # 重启服务
/etc/init.d/crond reload # 重新载入服务
加入开机启动:
chkconfig --level 35 crond on
crontab 配置文件
crontab
以分为全局和用户个人的配置文件,全说全局的配置文件:
全局配置
全局的配置文件全在 /etc/
目录下面:
配置文件跟据后缀名不一样,可以分为:每天,每周,每月,每小时
cron.d
是系统自己的定时任务配置文件
cron.deny
是用于控制不让哪些用户使用的 crontabl 功能
crontab
配置文件是用户可以自定义定时任务的全局配置文件
我们着重看一下: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
# 分 日 天 月 星期 命令
前面三行是服务定义的变量,注释下面才是我们添加定时任务的地方。
* 号代表不做限制,比如说,如果分钟字段是 * 号,那么这个任务,每分钟都执行。
, 逗号代表分隔时间段的意思,如果一天内,只有 3,5,7 这个时间段执行这个任务那么:3,5,7
- 代码范围取值,当一个任务白天执行,晚上不执行的时候,可以这样写:[7-18]
/ 代表时间的间隔频率,比如 `*/10 * * * * 命令` 就是每过10 分钟执行一次。
个人配置
每个用户都有一个自己的定时任务配置,并且这个配置不和全局配置冲突,这个文件的位置在:/var/spool/cron/
下面。
我们可以在这里修改自己的定时任务,也可以通过命令管理自己的定时任务:
crontab -l # 查看定时任务
crontab -e # 编辑定时任务
当使用 crontab -e
命令的时候,相当于编辑 /var/spool/cron/
下面自己的定时任务文件一样。
系统会每分钟扫描一次这个文件,所以这个定时任务的生效时间是下一分钟。
例子
每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11点到早上8点之间每两个小时和早上八点
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
1月1日早上4点
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/
每小时执行/etc/cron.hourly内的脚本
01 * * * * root run-parts /etc/cron.hourly
每天执行/etc/cron.daily内的脚本
02 4 * * * root run-parts /etc/cron.daily
每星期执行/etc/cron.weekly内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly
每月去执行/etc/cron.monthly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly
注意: “run-parts”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。
每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。
5,15,25,35,45,55 16,17,18 * * * command
每周一,三,五的下午3:00系统进入维护状态,重新启动系统。
00 15 * * 1,3,5 shutdown -r +5
每小时的10分,40分执行用户目录下的innd/bbslin这个指令:
10,40 * * * * innd/bbslink
每小时的1分执行用户目录下的bin/account这个指令:
1 * * * * bin/account
每天早晨三点二十分执行用户目录下如下所示的两个指令(每个指令以;分隔):
20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)
我的公众号
细节决定成败!
个人愚见,如有不对,恳请斧正!