2016-08-03 2 views
0

よしでプロセスを強制終了、私は次のようにコードが行く、ローカルポートにソケットを開き、プロセスを起動するプログラムを持っている:別のクラスからのオープンソケット

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() 

今、私は次のことを試してみましたので、上記の宣言リストprocessesにおけるプロセスのプールからプロセスを殺したい:

from socket_opener import processes 

process_killer.pyは、悲しいことに、それは限り、それは私がこれを他にどのような方法で行うことができます

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

このエラーがスローされますので、私は行くことができるようですか?

答えて

1

ここで最も近い原因は、モジュールをインポートしてsocket_openerにあるすべてのコードを再度実行していることです。ポート番号がPORTのソケットにすでにバインドされているソケットがあり、別のポートをバインドしようとしているため、これは失敗します。

(あなたはその動作には影響しませんようにそれを作成した後に私の知る限り、あなたがオブジェクトにserver_nameと属性を追加している。あなたは本当に完全な検証例(mcve)を提供する必要があります。 )

しかし、大きな問題は、あるプログラム(socket_opener)でリストを定義し、別のプログラム(process_killer)からそのリストにアクセスできるという前提のもとで動作しているように見えるということです。この方法では動作しません。最初のプログラムは、2番目のプログラムとは別の独自のプロセスアドレス空間で動作します。 2番目のプログラムは最初の変数にアクセスすることはできません。

異なるプログラム(ファイル、共有メモリセグメント、または他のIPC [プロセス間通信]メカニズム)からアクセス可能な外部オブジェクトにプロセスリストを配置する必要があります。リストの形式は、別のプログラムが消費する可能性のあるものでなければならないでしょう。すなわち、python listオブジェクトの代わりにプロセスIDのテキストリストを、Popenというオブジェクトが含まれていて、元のプログラムのアドレススペース。

+0

答えに努力してくれてありがとうございます。そうです、オブジェクトはポートにバインドされてアクセスできなくなりました。私はpidをデータベースに保存して、それを殺す必要があるときはいつでもそれを取得してしまいました。 –

関連する問題