介绍
linux系统下,除通过编程运行代码实现定时任务外,还可以通过自带(也可以手动安装)的crontab命令完成定时执行任务功能。
命令
- 查看cron是否启动:
$:/etc/init.d/cron status # 或者 systemctl status cron.service
- 启动:
$:/etc/init.d/cron start # 或者 systemctl start cron.service
- 停止:
$:/etc/init.d/cron stop # 或者 systemctl stop cron.service
- 重启:
$:/etc/init.d/crop restart # 或着 systemctl restart cron.service
- 查看系统任务(系统任务是系统要执行的任务,一般不做修改,此处查看是为了格式参考):
$:cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
说明:
意义:
m: minute(0-59);
h: hour(0-23);
dom: day of month(1-31);
mon: month(1-12或者jan,feb,mar,...);
dow: day of week(0-6或者sun, mon, tue..., 数字时周日可以是0或7);
user: 用户;
command: 要执行的指令;
取值:
*: 所有;
,: 可以取的值,如1,2,5,8;
-: 取值范围,如1-5;
/: 间隔频率,如0-23/2表示每两小时执行一次。
注意:
数值尽量用两位的;
环境变量尽量先声明;
路径尽量使用绝对路径;
- 编辑(创建)任务:
$:crontab [-u user] -e
- 删除任务:
$:crontab [-u user] -r[i] # i表示删除时先询问
- 查看任务:
$:crontab [-u user] -l
- 启动任务:
$:crontab [-u user] file # 这里file就是crontab -e编辑后保存的任务文件
案例
这里模拟一个简单需求,定时将日志文件移动到指定目录。
- 编写测试文件(create_log.py)模拟产生日志:
import time
import os
def create_log(path):
num = 1
while True:
with open(os.path.join(path, '/home/gp/data/log.log{}'.format(num)), 'w') as f:
f.write('test log...')
time.sleep(10)
num += 1
if __name__ == '__main__':
log_path = '/home/gp/data'
create_log(log_path)
- 编写任务(gp用户,保存至/home/gp/data/mytask):
...
# m h dom mon dow command
* * * * * mv /home/gp/data/log.log* /home/gp/data/log/
- 启动任务:
$:crontab mytask
- 启动python程序:
$:python create_log.py
- 效果:
可以看到,每隔10s会在/home/gp/data下面产生一个log*文件,而系统每隔1分钟就会将其移动至./log目录下。
实际使用时,当实现功能比较复杂时,一般先编写shell脚本,在cron任务中定时调用shell脚本。如:
0 0 * * * /shell /uploadFile2Hdfs.sh # 每天凌晨12点执行脚本将日志上传至hdfs。