Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 5427|回复: 0

Linux中定时任务执行python脚本失败的解决方法

[复制链接]
  • TA的每日心情
    奋斗
    前天 12:49
  • 签到天数: 789 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    722638
    发表于 2021-4-23 13:04:00 | 显示全部楼层 |阅读模式

    因工作需要,需要在服务器中写一个定时任务,定时把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命令的是时候要特别考虑其使用场景。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-8 17:59 , Processed in 0.061219 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表