在后台为python运行Google Cloud SQL Proxy



我正在使用Ubuntu mate在树莓上运行谷歌云SQL代理,但目前,我必须打开一个终端来启动代理,打开另一个终端才能运行我的python SQL脚本。我需要自动化这个过程。

要启动我运行的代理:

cd my_proxy_dir
sudo ./cloud_sql_proxy -dir=./ -instance_name -credential_file=./key_file.json

输出的最后一行是

准备好连接

█(方块闪烁,终端被阻止,代理拥有终端)

在第二个终端中,我运行我的python脚本,其中包括到云实例的MySQL连接,并且第一个终端的输出报告新连接,在我的python脚本结束时,还通知连接:

(时间戳)准备连接。。。

(时间戳)新建连接。。。

(时间戳)的连接已完成。。。

█(方块闪烁,终端被阻止,代理拥有终端)

现在,由于我使用python,我创建了一个线程,因为我无法在没有阻塞的情况下运行代理启动命令。这是我的运行方法:

my_thread...    
def run(self)
subprocess.call(['sudo', './proxy/cloud_sql_proxy', '-dir=./proxy/', '-instances=instance_name','-credential_file=./proxy/key_file.json', '&'])
print('pass')

在我用thread.terminate()终止线程之前,它从不打印"pass">

然后我做什么

my_proxy_thread = Thread_proxy()
my_proxy_thread.start()
time.sleep(10) #because I don't know when the proxy socket has bee created so I only wait
# Once created the socket
do_my_mysql_stuff()
my_proxy_thread.terminate() # kill the thread and also the proxy socket in the bad way

它工作了,我的代理套接字被创建了,my_sql工作正常,但我无法控制代理输出,我不知道发生了什么,如果它失败或关闭了,工作。。。我无法发送关闭套接字的指令。由于子流程命令输出,我在进行日志记录的终端中遇到了麻烦

我需要什么?

  1. 如果我能从子进程中获得stdout,那就太好了,这样我就可以意识到套接字何时被创建和连接,但直到现在我还不能,即使有PIPE,它也会阻塞
  2. 我不希望在终端中打印子流程的结果,因为我使用的是日志记录包,所以子流程的stdout会在我的终端日志中造成混乱:(
  3. 向子进程发送Control+C以停止代理,而不是粗略地终止读取

感谢所有人:)

  1. 您需要深入了解linux进程管理,才能完成您想要的任务。首先,subprocess.call将直接将参数传递给进程,而不使用中间shell。&是shell的一部分,因此需要设置Shell=true才能正确解释它
  2. 对于子流程的结果,如果您在pi本身上使用终端模拟器,您可以让它打开一个运行代理的新终端,而不是直接运行代理。您也可以将它附加到一个文件中,然后用另一个窗口跟踪该文件
  3. 您可以让代理在后台运行,而不需要每次都启动它。你应该能够直接通过ip连接,根本不需要运行代理

相关内容

  • 没有找到相关文章

最新更新