2017-11-14 7 views
0

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?

  1. 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 .
  2. 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 :(
  3. Senden Sie ein Control + C zum subprocess den Proxy zu stoppen, anstatt die so grob

Danke an alle :)

Antwort

0
  1. lesen beenden Sie gehen graben müssen tiefer in die linux-Prozess-Management zu bekommen, was geschehen soll, . Erstens übergibt subprocess.call die Argumente direkt an die Verarbeitung ohne die Zwischenshell. Die & ist Teil der Shell, also müssen Sie Shell=true für richtig interpretiert werden.
  2. Für das Ergebnis des Subprozesses, wenn Sie einen Terminal-Emulator auf dem Pi selbst verwenden, können Sie den Proxy nicht direkt ausführen, sondern ein neues Terminal öffnen, auf dem der Proxy läuft. Sie können es auch einfach an eine Datei anhängen lassen und dann ein anderes Fenster mit der Datei hinterlassen.
  3. Sie können den Proxy einfach im Hintergrund laufen lassen und müssen ihn nicht jedes Mal neu starten. Sie sollten direkt über ip direkt eine Verbindung herstellen können und den Proxy überhaupt nicht ausführen müssen.
Verwandte Themen