我相信,使用crontab来执行周期性任务的你一定遇到了很多莫名其妙的问题,我们需要了解crontab独特的个性以及它强大的技能。
我们可以使用crontab执行周期性任务,无论是shell脚本,还是Python程序。。。
查看已安装的周期性任务:crontab -l
,list cron task
编辑并安装周期性任务:crontab -e
,edit cron task
环境变量
crontab会以用户的身份执行配置的命令,但是不会加载用户的环境变量,crontab会设置几个默认的环境变量,例如SHELL、PATH和HOME等,一定要注意PATH可不是用户自定义的PATH。所以相信如果你想用crontab来执行python程序,你一定踩过crontab环境变量的坑:)
查看crontab环境变量:vi /etc/crontab
在crontab任务中定义临时环境变量:
* * * * *
PATH=/home/ubuntu/anaconda/bin:/bin
&& ./scripts/vivo/train.sh tune_steps 7 >> /data3/crontab.log 2>&1 &
59 23 * * *
/home/ubuntu/anaconda/bin/python
/data/test.py >> /data//test.log 2>&1 &
路径
我们在写脚本时往往会使用相对路径,但是在crontab执行脚本时,由于工作目录不同,就会出现找不到文件或者目录不存在的问题。
解决方法是脚本中使用绝对路径
或者在执行程序前切换工作目录
,例如直接在crontab命令中切换工作目录:
0 12 * * * source $HOME/.bash_profile &&
cd $HOME/path/to/workdir
&& ./script > /HOME/log/file 2>&1
输出
要将crontab命令的输出记录到日志文件中,可以使用重定向,不仅要重定向stdout也要重定向stderr,因为Python解释器会将异常输出到stderr。示例:
59 23 * * * /home/ubuntu/anaconda/bin/python /data/test.py
>> /data//test.log
2>&1 &
用法
crontab的用法这里就不说了,很多资料,任务最小周期是一分钟
介绍一个很好的crontab辅助网站,https://crontab.guru/
References:
https://segmentfault.com/a/1190000002724336
https://crontab.guru/
http://www.adminschoice.com/crontab-quick-reference