Linux中定時任務執行python腳本失敗的解決方法

因工做須要,須要在服務器中寫一個定時任務,定時把redis數據庫中的數據查詢出來存放在mysql數據庫中,奈何沒寫過shell腳本,只能用python代替了。肯定好思路開始行動。python

寫腳本

#!/usr/local/bin/pyhton
import redis
import pandas
import numpy
import pymysql
from sqlalchemy import create_engine
# 鏈接redis數據庫
try:
	pool = redis.ConnectionPool(host='192.168.*.*', port='6379', decode_responses=True, db=2, password='111111')
	re = redis.Redis(connection_pool=pool)
except Exception as e:
	print(e)
# redis數據庫中存的是哈希值,先查出鍵,再把全部的值查出來放在一個列表中
li = []
lis = re.keys('*')
for i in lis:
	print(re.hgetall(i))
	li.append(re.hgetall(i))
# 使用pandas轉換數據,存入mysql中
sq = pandas.DataFrame(li)
engin = create_engine('mysql+pymysql://admin:111111@192.168.*.*:3306/redis')
try:
	sq.to_sql('tt', engin, index=False, if_exists='append')
except Exception as e:
	raise e

腳本存放在linux的 /foot/test.py ==並賦予可執行權限(特別注意)== 並建立日誌文件run.log ,先測試一下mysql

python test.py

執行沒問題linux

編寫定時任務(測試先每三分鐘執行一次)

*/3 * * * * python /foot/test.py >> /foot/run.log 2>&1

任務執行後報錯,查看run.log日誌redis

ImportError: No module named redis
pip list | grep redis   查詢redis模塊也已經安裝了

這時候就納悶了,剛纔還執行好好的啊!!!!
通過多方查詢,終於找到緣由(暫且不表,先作一個測試)
再寫一個腳本test2.py,放在定時任務中執行sql

import sys
print(sys.path)
*/3 * * * * python /foot/test2.py >> /foot/run.log 2>&1

查看日誌顯示shell

['/foot', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', '/usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/python2.6/site-packages', '/usr/lib/python2.6/site-packages']

在定時任務外面再一次執行後打印結果 python test2.py數據庫

['/foot', '/usr/local/python3/lib/python36.zip', '/usr/local/python3/lib/python3.6', '/usr/local/python3/lib/python3.6/lib-dynload', '/usr/local/python3/lib/python3.6/site-packages', '/usr/local/python3/lib/python3.6/site-packages/redis-3.2.1-py3.6.egg']

對比後發現,linux定時任務中python使用的版本爲python2.6,定時任務外使用的python3.6,搜索模塊的路徑也不相同,而剛開始咱們的定時任務中使用的是python2.6,搜索模塊的路徑根本不是咱們所須要的路徑,python3和python2又不兼容,所以纔會出現找不到redis模塊的錯誤信息。知道這個緣由,解決起來就容易了。
安裝python3的時候python命令存放路徑是/usr/local/bin/python,只須要把定時任務中python命令特別指定一下便可服務器

*/3 * * * * /usr/local/bin/python /foot/test.py >> /foot/run.log 2>&1

再次執行任務後,任務執行成功。
linux默認預裝python2,若是從新安裝python3,再使用python命令的是時候要特別考慮其使用場景。app

相關文章
相關標籤/搜索