2016-08-03 31 views
0

Okay Ich habe ein Programm, das eine Buchse an einen lokalen Port und startet Prozesse öffnet, geht der Code wie folgt:einen Prozess auf einer offenen Buchse von einer anderen Klasse zu töten

socket_opener.py

processes=[] 
Handler = CGIHTTPServer.CGIHTTPRequestHandler 
Handler.cgi_directories = ["/maps"] 
httpd = SocketServer.TCPServer(("", PORT), Handler) 
httpd.server_name = "localhost" 
httpd.server_port = 8008 
processes.append(subprocess.Popen("ls")) 
processes.append(subprocess.Popen("ls")) 
httpd.serve_forever() 

Jetzt möchte ich einen Prozess aus dem Pool der Prozesse in der Liste töten processes oben so erklärte ich folgendes versucht:

process_killer.py

from socket_opener import processes 

das ist leider so weit ich gehen konnte, weil es diesen Fehler

socket.error: [Errno 98] Address already in use 

Was andere Art und Weise wirft kann ich dies tun?

Antwort

1

Die nächste Ursache ist, dass Sie den gesamten Code in socket_opener erneut ausführen, indem Sie das Modul importieren. Das schlägt fehl, da bereits ein Socket an den Port PORT gebunden ist und Sie versuchen, einen anderen zu binden.

(Soweit ich das beurteilen kann, das Sie hinzufügen server_name und Attribute für das Objekt, nachdem Sie es erstellt haben, die keine Auswirkungen auf den Betrieb haben. Sie sollten wirklich ein komplettes nachprüfbare Beispiel liefern (mcve).)

Aber das größere Problem ist, dass Sie scheinbar unter der Annahme arbeiten, dass Sie eine Liste in einem Programm definieren können (socket_opener) und dann auf diese Liste von einem anderen Programm zugreifen (process_killer). Es funktioniert nicht so: Das erste Programm wird in einem eigenen Prozessadressraum betrieben, der von dem des zweiten Programms getrennt ist. Das zweite Programm kann nicht auf Variablen in der ersten zugreifen.

Sie müssten die Prozessliste in ein externes Objekt einfügen, auf das von einem anderen Programm aus zugegriffen werden kann (eine Datei, ein Shared Memory-Segment oder ein anderer IPC [Interprozesskommunikation] -Mechanismus). Und die Form der Liste müsste eine sein, die ein anderes Programm konsumieren könnte: eine Textliste von Prozess-IDs, zum Beispiel anstelle eines Python list Objekts, das python Popen Objekte enthält, von denen keines außerhalb der ursprünglichen Programmadresse Sinn ergibt Raum.

+0

Danke für die Mühe auf die Antwort, Sie haben Recht, die Objekte wurden an den Port gebunden, so dass es unmöglich ist, zuzugreifen. Am Ende habe ich die PID in einer Datenbank gespeichert und sie immer dann abgerufen, wenn ich sie töten musste. –