Ich benutze Google Cloud SQL Proxy auf einem Raspberry mit Ubuntu Mate, aber derzeit muss ich ein Terminal öffnen, um den Proxy und ein anderes zu starten, um meine Python SQL-Skript ausführen. Ich muss diesen Prozess automatisieren.Ausführen von Google Cloud SQL Proxy im Hintergrund für Python
den Proxy starten ich laufen:
cd my_proxy_dir
sudo ./cloud_sql_proxy -dir=./ -instance_name -credential_file=./key_file.json
Die letzte Zeile der Ausgabe ist
Bereit für Verbindungen
█ (das Quadrat blinkt, wird der Anschluss gesperrt, der Proxy besitzt das Terminal)
In einem zweiten Terminal Ich betreiben meinen Python-Skript, das eine MySQL-Verbindung mit der Cloud-Instanz enthält, und der Ausgang des ersten Endgeräts meldet die neue Verbindung, am Ende meines Python-Skript die Verbindung auch mitgeteilt wird:
(Timestamp) Bereit für Verbindungen ...
(Timestamp) Neue Verbindung ...
(Zeitstempel) Anschluss für ...
█ fertig (das Quadrat blinkt, wird der Anschluss blockiert wird, besitzt der Proxy die Terminal)
Jetzt, da ich mit Python arbeite, habe ich einen Thread erstellt, weil ich den Proxy-Startbefehl nicht ausführen konnte, ohne zu blockieren. Das ist mein run-Methode:
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')
Es ist nie "Pass" drucken, bis ich den Faden mit thread.terminate beenden()
Dann, was ich tun
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
Und es funktioniert, mein Proxy-Socket wird erstellt, my_sql funktioniert ok, aber ich habe keine Kontrolle über die Proxy-Ausgabe, ich weiß nicht, was passiert, wenn es fehlgeschlagen ist oder geschlossen ist, funktioniert ... Ich kann die Anweisung nicht senden, den Socket zu schließen. Und ich bekomme ein Chaos in meinem Terminal, wo ich loggen wegen der Unterprozess-Befehl Ausgabe
Was brauche ich?
- Es wäre toll, wenn ich die stdout des Teilprozesses bekommen konnte, konnte ich so realisieren, wenn der Socket erstellt und angeschlossen ist, aber ich habe nicht in der Lage, bis jetzt gewesen, auch mit Blöcken PIPE es .
- Ich möchte nicht, dass das Ergebnis des Unterprozesses im Terminal gedruckt werden, weil ich das Protokollierungspaket verwende, so dass die Stdout des Unterprozesses Unordnung in meinen Terminalprotokollen schafft :(
- Senden Sie ein Control + C zum subprocess den Proxy zu stoppen, anstatt die so grob
Danke an alle :)