PyMySQL不是从Cron连接而是从Console连接

时间:2017-01-23 23:09:40

标签: python mysql sockets cron pymysql

我有一个通过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)

constants.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

2 个答案:

答案 0 :(得分: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 config:

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

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

#!/usr/bin/env python

答案 1 :(得分:0)

当我的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

希望这会有所帮助。