2016-04-19 4 views
0

ドメインソケットをロックとして使用して1つのアクティブインスタンス(Linuxカーネル> = 2.6)を保証する予定です。python:新しいプロセスから孤立したドメインソケットを閉じる方法

したがって、私はアクティブなプロセスにドメインソケットをバインドしており、fsのより人間にやさしいチェックオプションのためにPIDでロックファイルを作成しています。

import socket 
class processLock(object): 
    def __init__(self, processName): 
     self.processName = processName 
     self.PIDfile = os.path.join(self.getTMPDIR(),"UID-%s_PROCESS-%s.pid" % (os.getuid(), processName)) 
     ... 
     self.socket.bind('\0' + self.processName) 
     ... 
     atexit.register(self.cleanup) 
    ... 
    def cleanup(self): 
     self.socket.shutdown(socket.SHUT_RDWR) 
     self.socket.close() 
     self.socketOK = False 
     os.remove(self.PIDfile) 

これは、一般的に取り組んでいるが、今私はそれが出口でそのソケットを閉じていなかったとソケットはプロセスの存続期間を超えて開いたままになるようにハードプロセスを殺すために管理:

> lsof 
    condorJob 124485  root 4u  unix 0xffff88186c3341c0  0t0 175181414 @TestFooName 
    condorJob 124485  root 5w  REG    8,6   0 13893673 /var/tmp/UID-0_PROCESS-TestFooName.pid (deleted) 

私はクロスチェックとしてPIDファイルを持っているので、私はソケットツリーを唯一のものとしてプロセスツリーのサニティチェックの後に閉じたいと思っています。しかし、それはまだ〜ゾンビソケットとしてバインドされているので、私は新しいインスタンスからソケットにバインドできません。

既存のUnixドメインソケットを閉じるためのPythonの方法はありますか(必要に応じてpid 0として実行しています)?

答えて

0

私の側では間違いでした。別のタブで手動でプロセスをスリープ状態にしていましたが、PIDを表示しているにもかかわらず、プロセスを実現できませんでした。プロセスを終了した後、カーネルは意図したとおりにソケットを閉じました。だから、すべてが期待通りに動いている。

関連する問題