因工作需要,需要在服務器中寫一個定時任務,定時把redis數據庫中的數據查詢出來存放在mysql數據庫中,奈何沒寫過shell腳本,只能用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
,先測試一下
python test.py
執行沒問題
編寫定時任務(測試先每三分鍾執行一次)
*/3 * * * * python /foot/test.py >> /foot/run.log 2>&1
任務執行后報錯,查看run.log日志
ImportError: No module named redis
pip list | grep redis 查詢redis模塊也已經安裝了
這時候就納悶了,剛才還執行好好的啊!!!!
經過多方查詢,終於找到原因(暫且不表,先做一個測試)
再寫一個腳本test2.py,放在定時任務中執行
import sys
print(sys.path)
*/3 * * * * python /foot/test2.py >> /foot/run.log 2>&1
查看日志顯示
['/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命令的是時候要特別考慮其使用場景。