【问题标题】:PyMySQL does not connect from Cron but from ConsolePyMySQL 不是从 Cron 而是从控制台连接
【发布时间】:2017-06-08 14:40:47
【问题描述】:

我有一个通过pyMySQL 连接到 MySQL 数据库的脚本。

当我从控制台手动执行它时,它就像一个魅力,但是当我运行这个 cronjob 时会给出这个输出:

@reboot sudo python3 /var/www/html/ls/src/AppBundle/Command/crawl.py true > /tmp/listener.log 2>&1

结果:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/pymysql/connections.py", line 890, in connect
(self.host, self.port), self.connect_timeout)
 File "/usr/lib/python3.5/socket.py", line 711, in create_connection
raise err
File "/usr/lib/python3.5/socket.py", line 702, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

这是为什么呢?我遵循了所有这些https://stackoverflow.com/a/15684341/1092632 没有任何成功。

感谢任何提示!

编辑

我尝试过的事情:

connect = pymysql.connect(host=constants.HOST,
                          user=constants.USERNAME,
                          passwd=constants.PASSWORD,
                          db=constants.DATABASE,
                          charset='utf8mb4',
                          port=constants.PORT,
                          unix_socket=constants.SOCKET,
                          cursorclass=pymysql.cursors.DictCursor)

常量.py

​​>
# MySQL #
HOST = '127.0.0.1' // Localhost, 127.0.0.1 and public IP of Server (having bind to 0.0.0.0
USERNAME = 'admin'
PASSWORD = 'XXX'
DATABASE = 'ls_base'
PORT = '3306' // With and without ''
SOCKET = '/var/run/mysqld/mysqld.sock' // File exists

【问题讨论】:

  • 我猜您的客户端正在尝试连接到错误的套接字或端口,请参阅stackoverflow.com/questions/6885164/…
  • 既不添加unix_socket='/var/run/mysqld/mysqld.sock',(文件存在)也不专门添加正确的端口似乎可以解决问题。套接字将错误更改为[Errno 2] No such file or directory)
  • 您使用什么主机名进行连接?使用“localhost”将调用套接字文件连接,使用“127.0.0.1”将调用网络连接。

标签: python mysql sockets cron pymysql


【解决方案1】:

这个问题可能是由 1.服务器配置 或由您的 2.python代码。

对于第 2 点,要确保从错误中排除您的代码,请尝试以下操作:

import MySQLdb
def dbconnect():
    try:
        db = MySQLdb.connect(
            host='localhost',
            user='root',
            passwd='XXX',
            db='myDB'
        )
    except Exception as e:
        sys.exit(e)
    return db
print dbconnect()

此代码在 STOCK、RHEL 服务器上运行 whit cron:

* * * * * root /var/www/html/myApp/stopClock/stopClock.py

如果这不起作用,并且您收到相同的错误,则问题是您的服务器 cron 配置:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/var/www/html/myApp

这是我使用的。当然还有我第一行代码中的 Shebang:

#!/usr/bin/env python

【讨论】:

  • 它确实有效,<_mysql.connection open to 'localhost' at 2b4b438> 说。目前我使用一个在登录时启动脚本的守护进程,它令人惊讶地工作但实际上并不是我想要的......所以结论是它应该与代码一起使用,但是为什么手动调用它时它会工作呢?
  • 很好,您离解决问题更近了一步,您可以粘贴您的代码,尤其是开始部分,以及您连接到 MySQL 的部分吗?
  • 同时检查你的 var/log/messages 是否有你使用 cron 启动的模块上的错误:Jan 23 09:47:07 AppRoot abrt: detected unhandled Python exception in '/var/www/html/myApp/cleaner.py'
【解决方案2】:

当我的 python3 代码从 cron @reboot 执行连接到我的本地主机数据库时,我也有 errno 111。从 shell 执行时,python3 代码运行良好。经过多次调试,我发现数据库连接建立得太快了。我将此添加到我的代码中:

import subprocess

while subprocess.Popen('service mysqld status', shell=True, stdout=subprocess.PIPE).stdout.read().decode('utf-8').find('Active: active') == -1:
     sleep(1)
#once mysql is ready it will break out of while loop and continue to
connection = pymysql.connect(host='localhost'............the rest of your code

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2023-03-26
    • 2017-05-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多