目前有一个需求是定时执行某个 python 脚本,进行数据的统计。
具体思路为:1、先写一个shell
脚本,在脚本中写日志并执行python程序。2、通过定时任务crontab定时执行shell脚本。
1、创建了如下shell脚本surf_hor.sh,该脚本的作用是执行coll_hor.py程序,并记录日志。
#!/bin/bash
path=/root/project/program/
workName="coll_hor.py"
cd ${path}
date=$(date +%Y%m)
if [ -d "/root/project/shell/log/$date" ];then
echo "the dir is exit"
else
mkdir -p /root/project/shell/log/$date
fi
LogNameDATE=`date '+%Y%m%d'`
dtYMDHms=`date "+%Y-%m-%d %H:%M:%S"`
logPath="/root/project/shell/log/$date/log$LogNameDATE.log"
echo "${dtYMDHms} 执行程序 ${workName}" >> ${logPath}
python3 /root/project/program/${workName} >> ${logPath}
2、在Linux系统中设置定时任务:通过crontab -e对定时任务进行编辑,设置每小时的5分、20分、55分执行shell脚本。
5,20,55 */1 * * * /root/project/shell/surf_hor.sh > /dev/null 2>&1
3、!!!问题:通过定时任务执行的shell脚本,只能执行到记录日志,并不能够成功执行python文件,但直接在目录下./surf_hor.sh确能够成功执行python文件。
原因分析:
crontab是系统服务,出现的问题可能有两种
1、环境:正常可以执行, 但使用定时任务确无法执行,说明定时任务调起脚本并没有加载执行环境。
2、路径:在shell脚本中调用和执行python脚本时需要使用全路径,否则会执行失败。
第二种问题往往是第一种问题所引起的。
解决方法:
在脚本最前面加上一句: source ~/.bash_profile
这样运行环境就一模一样了。加上这句后,直接执行能成功的脚本放在crontab里就能执行成功啦~