linux(Ubuntu)使用cron完成定时任务


介绍

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。