【发布时间】: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 工作正常,但我无法控制代理输出,我不知道发生了什么,如果它失败或关闭,工作......我无法发送关闭套接字的指令。而且由于子进程命令输出,我在记录日志的终端上弄得一团糟
我需要什么?
- 如果我能获得子进程的标准输出,那就太好了,这样我就可以意识到套接字何时被创建和连接,但直到现在我还无法做到,即使使用 PIPE 它也会阻塞。李>
- 我不希望在终端打印子进程的结果,因为我正在使用日志记录包,所以子进程的标准输出会在我的终端日志中造成混乱:(
- 向子进程发送 Control + C 以停止代理,而不是如此粗暴地终止读取
谢谢大家:)
【问题讨论】:
标签: python subprocess google-cloud-sql