奇妙なネジ付きオープンFIFOの問題をデバッグする方法?
-
21-08-2019 - |
質問
ウェブサービスは、USR1信号を受信した場合、そのデータの一部を露出させるように構成されています。それは例えば、遠隔クライアントからの要求を受信すると、信号はxinetdのサーバによって送信されますWebサーバーがUSR1信号を受信したNC MYSERVER 50666.は、それは、専用のFIFOパイプを開き、パイプにそのデータを書き込み、その後、パイプを閉じます。一方で、xinetdのサーバがパイプを読み取り、リモートクライアントに供給します。
時代のほとんどでは、彼らはうまく動作しますが、時折、何らかの理由で、クライアントは、DUPレコードを受信します。ログから、パイプが適切に閉じられませんでしたように思えるし、キャッシュが残っているので、次回はそれが機能する場合、以前と現在の両方がクライアントに送信されます。問題の再現しようとしたとき、そのは常に起きていないが、運悪く、私は一度再現することができませんでした。
プロセスを実証するための簡単なスニペットを以下に示します:
Webサーバ:(webserver.py)
def SendStream(data, pipe):
try:
for i in data:
pipe.write(i + '\n')
pipe.flush()
finally:
pipe.close()
def Serve():
threading.Thread(target=SendStream, args=(data, pipe)).start()
てxinetd.dサーバ:(spitter.py)
def Serve():
if not os.path.exists(PIPE_FILE):
os.mkfifo(PIPE_FILE)
os.kill(server_pid, signal.SIGUSR1)
for i in open(PIPE_FILE):
print i,
それでは、正確にDUPを引き起こすことが起こったのか?どのようにそれをトリガーするには?私はパイプファイルのリンクを解除し、それを任意の残り物を避けるためにするたびに再作成が、それは適切な解決策だ場合、私は知りません。
現在の修正解決
、トラブルや法律であるあなたに起こるほとんど何があるでしょう。すなわち、webserver.pyにプロセスID値を追加してみてください。
pipe.write(STR(os.getpid())+ I + '\ n')
これは、照明される可能性があります。
他のヒント
ここでデバッグするために十分ありません。あなたは、サーバーが信号を処理し、またはパイプを開く方法を示していません。
すべての可能で、私は信号を使用していないお勧めしたい場合。彼らは、用事のpython独自の特殊性を持つ上に加え、Cに十分に毛深いです。
だから、本当の問題は、複数のクライアントが存在するがあるということです。サーバーは、最初に、顧客と合意したと、それは現在の設計の下で壊れることを確認されていませんでした他の未知のクライアントから虐待を受け/照会されています。修正プログラムは、問題に対処するために展開されています。だから、アンディの疑惑は正しいです。みんなありがとう!