【问题标题】:Running Google Cloud SQL Proxy on background for python在 python 的后台运行 Google Cloud SQL 代理
【发布时间】:2017-11-21 04:10:23
【问题描述】:

我正在使用 Ubuntu mate 在 Raspberry 上运行 Google Cloud 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. 如果我能获得子进程的标准输出,那就太好了,这样我就可以意识到套接字何时被创建和连接,但直到现在我还无法做到,即使使用 PIPE 它也会阻塞。李>
  2. 我不希望在终端打印子进程的结果,因为我正在使用日志记录包,所以子进程的标准输出会在我的终端日志中造成混乱:(
  3. 向子进程发送 Control + C 以停止代理,而不是如此粗暴地终止读取

谢谢大家:)

【问题讨论】:

    标签: python subprocess google-cloud-sql


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

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 2018-12-25
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多