linux——crontab 设置定时任务

1.crontab简介

crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

2.确定服务器是否开启定时任务计划服务

查看crond状态命令:systemctl status crond.service
在这里插入图片描述
命令: systemctl start crond.service开启服务
命令: systemctl stop crond.service关闭服务
命令: systemctl restart crond.service 重启服务
命令: systemctl reload crond.service 重新载入配置

3.crontab格式说明

格式为:* * * * * user command 分 时 日 月 周 用户 命令
举例:
1、每分钟执行一次
* * * * * user command
2、每隔2小时执行一次
* */2 * * * user command (/表示频率)
3、每天8:30分执行一次
30 8 * * * user command
4、每小时的30和50分各执行一次
30,50 * * * * user command(,表示并列)
5、每个月的3号到6号的8:30执行一次
30 8 3-6 * * user command (-表示范围)
6、每个星期一的8:30执行一次
30 8 * * 1 user command (周的范围为0-7,0和7代表周日)
7、每天的下午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

4.定时服务的设置方式

设置定时服务用两种方式
第一种:直接修改rc.local文件
vim /etc/rc.local 修改rc.local文件,设定定时服务
第二种:编辑服务(我用的第二种) 本质上都是一样的 修改之后要保存
crontab -e 编辑某个用户的cron服务
crontab -l列出某个用户cron服务的详细内容
修改之后 重启服务
命令: systemctl restart crond.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
在这里插入图片描述
保存文件 重启服务
命令: systemctl restart crond.service 重启服务

6.查看crontab的日志记录

命令:tail -f /var/log/cron
查看cron周期执行任务 ps -ef|grep cron

7.crontab不执行的问题

一般不执行的crontab的时候 先在命令行输入所要执行的命令,看看是不是bash文件命令写错了

7.1路径问题

建议所有路径名称都改为绝对路径!不仅是bash文件里,还是bash命令执行的文件里面的代码中出现的路径
有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:以root身份登录shell后执行一个/root/test.sh,只要执行. /test .sh
就可以了。但是在crontab中,就会找不到这个脚本,比如写完整:/root/test .sh
又比如bash文件与所运行的文件不在同一目录上
在运行文件上,需要访问一个/data/data.json的文件,而bash文件与py文件不在一个目录下,就会找不到这个文件,解决方法:1、代码中直接写绝对路径 2、bash文件中先cd到py文件所在目录

7.2权限问题

比如:脚本没有x执行权限,解决方法:
增加执行权限,或者用bash abc.sh的方法执行
也有可能crontab任务所属的用户对某个目录没有写权限,也会失败

7.3时差问题

因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。
时差这个问题还真是搞人,这个我亲身体验了,现象如下:
(1) 我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发现没有执行
(2) 但是我把脚本设置成每分钟执行一次,就是OK的
见鬼了,服务器时间是对的啊?莫非是要加个什么时区?于是把脚本的时间减10或者12或者8个小时都尝试了下,发现都不行。
但是很明显是时间不一致导致的不执行。
最后用如下两行解决了问题:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
service crond restart

更多不执行原因,详情见这篇博客


版权声明:本文为weixin_44217936原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。