我有一个访问 SQlite 数据库的 slack 机器人。当我在前台运行机器人时,一切正常,但是当我将它作为守护程序运行时,它似乎连接到我的数据库,但随后在我运行的每个查询中返回“未找到表”。
问题是,这在我的最新版本之前一直有效,但我找不到发生了什么变化,所以我制作了一个精简版作为测试,但我仍然遇到同样的问题。见下文:
import syslog
import sqlite3
import os
from daemonize import Daemonize
from slackclient import SlackClient
from qatoken import token
#Slack vars
nickname = "NetBot-QA"
dump = "#net-dump-qa"
channel = "#net-alerts-qa"
avatar = ":loader:"
#Daemonize vars
pid = "/tmp/netbot-qa.pid"
app = "net-bot-qa"
syslog.openlog('netbot', 0, syslog.LOG_LOCAL4 )
###################################################### MAIN
def main():
sc = SlackClient(token)
sc.api_call("chat.postMessage", username=nickname, channel=dump, text="{0}/net-alerts-test.db".format(os.path.dirname(__file__)), icon_emoji=avatar)
try:
conn = sqlite3.connect("{0}/net-alerts-test.db".format(os.path.dirname(__file__)))
c = conn.cursor()
c.execute("SELECT * from maint_calendar")
sc.api_call("chat.postMessage", username=nickname, channel=dump, text="made it!", icon_emoji=avatar)
except (SystemExit, KeyboardInterrupt):
raise
except Exception, e:
sc.api_call("chat.postMessage", username=nickname, channel=dump, text="The bot crashed", icon_emoji=avatar)
syslog.syslog("error: {0}".format(e))
########################################################################################
#main()
########################################################################################
#main()
daemon = Daemonize(app=app, pid=pid, action=main)
daemon.start()
如果我运行 main(),我会收到松弛消息“成功了!”,但如果我将其注释掉并运行 daemon.start(),我会收到“机器人崩溃”。
当我 cat /var/log/messages 时,我看到的是:
Nov 16 09:47:37 server1 netbot: error: no such table: maint_calendar
[root@server1 net-alerts]# pwd
/opt/bots/net-alerts
[root@server1 net-alerts]# sqlite3 net-alerts-test.db
SQLite version 3.7.17 2013-05-20 00:56:22
sqlite> .schema
CREATE TABLE maint_calendar (start time, finish time, summary text, dc_tag text, provider text, CONSTRAINT start_sum PRIMARY KEY (start, summary));
我也尝试使用数据库的静态路径运行它,但 os.path.dirname 与我使用的所有其他脚本都运行良好。我发现另一篇文章说你必须在守护进程上下文 (main()) 中建立数据库连接,但我从一开始就这样做了。我的想法不多了。