记一次使用crontab计划任务执行python脚本所遇问题及处理的过程

今天把一个python脚本迁移到Centos7,用crontab执行,期间遇到很多错误,最终把所遇问题一一处理,感觉有必要把处理过程记录下来

1、问题环境

  • Centos7 x64
  • python2.7 和python 3.5
  • 有安装virtualenvwrapper虚拟环境

2、问题描述

  • 此python脚本的功能是访问一个固定网站(刷账号积分,没啥大用,娱乐玩的),需要持续运行,由于某些原因,脚本会不定期的出现访问故障。针对此故障,可以通过优化脚本的方式来处理,还有一种方式是当出现故障时kill掉相关进程并重新运行脚本。我选择的是第二种处理方式,思路是每天在固定时间先kill掉之前的相关进程,然后运行脚本。
    crontab -l类似于下面这样:
46 5 * * *  /bin/sh /root/sh_dir/shua_ra2jifen.sh 

shua_ra2jifen.sh的内容如下:

#!/usr/bin/sh
ps -ef|grep shua_ra2_jinqian.py|awk '{print $2}'|xargs kill -9
sleep 2
cd ~/.virtualenvs/shuafangwenliang/shua_ra2_jinqian/
workon shuafangwenliang
for ((i=1; i<=10; i++))
do
        nohup python shua_ra2_jinqian.py &
done

3、故障描述

  • 故障1、crontab -e设置指定时间,到指定时间后,脚本不运行,查看cron日志,无内容,查看nohup日志,无内容。
    经过好长时间的尝试才找到问题原因,centos7系统是运行在vultr上的VPS,系统时间是美国当地的时间,而我设置的时间是按照本地笔记本系统上的时间来设置的,中间相差8个小时,而且本地笔记本的时间比北京时间晚了差不多一分钟的时间,为了方便测试,设置的计划任务的时间都是比现在时间延后一分钟,例如现在笔记本的时间是早上9点10分(其实真实的北京时间是9点12分,美国时间是1点12分),我在centos7设置的任务时间是早上1点11分运行,才导致测试失败。
  • 故障2、修正好故障1的情况后,cron报错误日志,显示python脚本中有中文字符的地方语法错误。单独在虚拟环境中运行shua_ra2_jinqian.py脚本或者shua_ra2jifen.sh脚本是没问题的。
    在网上查找资料后,在crontab中添加LANG=zh_CN.UTF-8,依然有相同的错误,无奈只好把python脚本中的中文字符部分给改掉,再次添加crontab计划任务,查看cron报错日志显示缺少urllib2模块,这个错误倒是让问题一下明朗了起来,排查思路转到是否为python路径错误的问题,于是在shua_ra2jifen.sh脚本中第一行添加语句#!/usr/bin/python2.7,在shua_ra2_jinqian.py脚本第一行添加语句:#!/usr/bin/env python,修改crontab计划任务时间重新执行,查看cron日志问题依然如旧,也就是说上述方法不好使。左思右想后,把shua_ra2jifen.sh脚本中执行python脚本的语句指定了python的路径,内容如下:
#!/usr/bin/sh
ps -ef|grep shua_ra2_jinqian.py|awk '{print $2}'|xargs kill -9
sleep 2
cd ~/.virtualenvs/shuafangwenliang/shua_ra2_jinqian/
workon shuafangwenliang
for ((i=1; i<=10; i++))
do
        nohup /usr/bin/python2.7 shua_ra2_jinqian.py &
done

这样脚本就成功执行了,再次查看cron日志,还是有一条错误,显示无workon命令,于是在搜索引擎输入关键字“crontab workon”,对脚本做了如下修改,并成功解决了问题。
shua_ra2jifen.sh

#!/usr/bin/sh

ps -ef|grep shua_ra2_jinqian.py|awk '{print $2}'|xargs kill -9
sleep 2
cd ~/.virtualenvs/shuafangwenliang/shua_ra2_jinqian/
source ../bin/activate
for ((i=1; i<=10; i++))
do
        nohup python shua_ra2_jinqian.py &
done

crontab -e每小时执行一次

0 * * * *  export LANG="en_US.UTF-8"; /bin/sh /root/sh_dir/shua_ra2jifen.sh >/root/a.log 2>&1

4、针对以上两个问题做一个总结:

  • 第一个问题是由于crontab执行时间设置有误,有过这样的经历后下次再有类似的问题就可以快速的锁定问题并排除。
  • 第二个问题,问题根本原因是想当然的在crontab计划任务中执行sh脚本,让目录切换到虚拟环境目录,用workon运行虚拟环境,执行虚拟环境中的特定python版本,然而,crontab不能调用workon命令,开启不了虚拟环境,也就运行不了特定版本的python,导致后续一系列的问题,例如python中文字符的问题、模块不能加载的问题等等,针对此问题,可以先cd到虚拟环境的bin目录,然后执行source activate即可开启虚拟环境。

你可能感兴趣的:(经验,学习总结,python学习)