出现问题:
在命令行中使用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代码里写入文件和调用文件的代码也要写成绝对路径。