文章目录
1.crontab简介
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其储存于“crontab”文件中,以供然后读取和执行。crontab存储的指令被守护进程激活linux 计划任务 每小时执行一次,crond经常在后台运行,每一分钟检测是否有预定的作业须要执行。这类作业通常称为cronjobs。
2.确定服务器是否开启定时任务计划服务
查看crond状态命令:systemctlstatuscrond.service
命令:systemctlstartcrond.service开启服务
命令:systemctlstopcrond.service关掉服务
命令:systemctlrestartcrond.service重启服务
命令:systemctlreloadcrond.service重新载入配置
3.crontab格式说明
格式为:*****usercommand分时日月周用户命令
举例:
1、每分钟执行一次
*****usercommand
2、每隔2小时执行一次
**/2***usercommand(/表示频度)
3、每天8:30分执行一次
308***usercommand
4、每小时的30和50分各执行一次
30,50****usercommand(,表示并列)
5、每个月的3号到6号的8:30执行一次
3083-6**usercommand(-表示范围)
6、每个礼拜一的8:30执行一次
308**1usercommand(周的范围为0-7,0和7代表周五)
7、每天的上午4点、5点、6点的5min、15min、25min、35min、45min、55min时执行命令。
5,15,25,35,45,5516,17,18***Command
4.定时服务的设置方法
设置定时服务用两种方法
第一种:直接更改rc.local文件
vim/etc/rc.local更改rc.local文件,设定定时服务
第二种:编辑服务(我用的第二种)本质上都是一样的更改以后要保存
crontab-e编辑某个用户的cron服务
crontab-l列举某个用户cron服务的详尽内容
更改然后重启服务
命令:systemctlrestartcrond.service重启服务
5.实例
通常定时任务都是启动的bash脚本文件,就是.sh结尾的文件,编辑了一个truncateToday.sh文件
作用是启动对应的truncateToday.py文件
#!/bin/sh
#export PATH=$PATH:/usr/local/bin
#source /stock/stock-project/env/bin/activate
python3 /stock/operate-data/truncateToday.py
接出来设置定时任务
crontab-e
保存文件重启服务
命令:systemctlrestartcrond.service重启服务
6.查看crontab的日志记录
命令:tail-f/var/log/cron
查看cron周期执行任务ps-ef|grepcron
7.crontab不执行的问题
通常不执行的crontab的时侯先在命令行输入所要执行的命令,瞧瞧是不是bash文件命令弄错了
7.1路径问题
建议所有路径名称都改为绝对路径!除了是bash文件里,还是bash命令执行的文件上面的代码中出现的路径
有的命令在shell中执行正常linux ftp,然而在crontab执行却总是失败。有可能是由于crontab使用的sh未正确辨识路径,例如:以root身分登入shell后执行一个/root/test.sh,只要执行./test.sh
就可以了。并且在crontab中,都会找不到这个脚本,例如写完整:/root/test.sh
又例如bash文件与所运行的文件不在同一目录上
在运行文件上,须要访问一个/data/data.json的文件,而bash文件与py文件不在一个目录下linux 计划任务 每小时执行一次,才会找不到这个文件,解决方式:1、代码中直接写绝对路径2、bash文件中先cd到py文件所在目录
7.2权限问题
例如:脚本没有x执行权限,解决方式:
降低执行权限,或则用bashabc.sh的方式执行
也有可能crontab任务所属的用户对某个目录没有写权限,也会失败
7.3时差问题
由于服务器与顾客端时差问题,所以crontab的时间以服务器时间为准。
时差这个问题还真是搞人,这个我亲身体验了linux学习论坛,现象如下:
(1)我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发觉没有执行
(2)并且我把脚本设置成每分钟执行一次,就是OK的
见鬼了,服务器时间是对的啊?难道是要加个哪些时区?于是把脚本的时间减10或则12或则8个小时都尝试了下,发觉都不行。
然而很显著是时间不一致引起的不执行。
最后用如下两行解决了问题:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
service crond restart