我有一个通过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)
# 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
答案 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
希望这会有所帮助。