解决Centos7使用定时任务在脚本中执行python代码失败的问题

141 阅读2分钟

出现问题:

在命令行中使用python xxx.py运行python代码顺利执行;把python xxx.py写在脚本里手动./xx.sh执行脚本也有结果,但是把脚本放到系统定时任务跑却没结果。很是奇怪。



寻找问题:

在定时任务指令后面添加2> /tmp/error.log &来查看错误日志,发现提示”python不是可执行命令“!。。

在网上搜索一些帖子后知道了是环境变量的问题。上面提到的前两种执行python代码的形式都用到了系统的环境变量,但crontab有自己独立的空间,它不知道我们在系统中设置过哪些环境。因此,需要给定时任务引入环境变量。



解决问题:

当然,首先我们要设置python的环境变量。查看python3的位置

which python3  
# 我这里返回的是:/usr/local/bin/python3  (这一部分要添加到下面的配置文件,路径不要错)

然后配置bash_profile文件

vi ~/.bash_profile

写入

PATH="/usr/local/bin:${PATH}"
export PATH
alias python="/usr/local/bin/python3"

按照vim格式保存退出,然后更新

source ~/.bash_profile


输入python -V验证,提示以下信息就说明可以了。

[root@iZuf63v13g2lh7q8443kxnZ statistics]# python -V
Python 3.7.5


继续配置etc/profile文件

vi /etc/profile

写入

export PYTHON_HOME=/usr/local/bin/python3

按照vim格式保存退出,然后更新

source ~/.bash_profile

至此,环境变量配置完成,现在需要在脚本中引入:在即将执行的Shell脚本的前三行,设置如下的三句:

\#!/bin/sh
. /etc/profile
. ~/.bash_profile

最后,在脚本中的指令为

python3  xxx.py   # 最好用python3

注意:以上定时语句,或者shell脚本中的命令,或者配置文件中的命令,里面的路径都要写成绝对路径。python代码里写入文件和调用文件的代码也要写成绝对路径。