[英]python xinetd client disconnection handling
這可能是編碼問題,也可能不是編碼問題。 我不知道這也可能是xinetd守護程序問題。
我有一個從運行xinetd的linux服務器觸發的python腳本。 Xinetd已設置為僅允許一個實例,因為我只希望一台計算機能夠連接到該服務,因此也受到IP的限制。
當前,當客戶端連接到xinetd時,該服務可以正常工作,並且腳本開始將其輸出發送到客戶端計算機。 但是,當客戶端斷開連接(即:由於重新啟動)時,該進程仍在服務器上運行,這將阻止客戶端在完成重新啟動等操作后進行連接。
問:如何在python中檢測到客戶端已斷開連接。 也許我可以測試客戶端是否不再讀取stdout(然后退出腳本),或者在xinetd中有一種更輕松的方法來使客戶端斷開連接時殺死子進程嗎?
(我在RHEL5 linux上使用python 2.4.3-需要2.4的解決方案,但3.1的解決方案也很有用。)
為SIGHUP添加信號處理程序。 (x)inetd在套接字斷開時發送此消息。
您似乎沒有得到SIGHUP,但是至少在嘗試在連接上嘗試任何IO的情況下,您確實得到了SIGPIPE。 如果應用程序花費很長時間不執行任何IO,則可以啟動一個線程讀取stdin,以確保斷開連接后立即獲得SIGPIPE。 這對我的應用程序來說已經足夠好了,但是除了xinetd給我的那些管道之外,我沒有使用任何管道。
我在網上看到過很多地方,人們談論SIGHUP在客戶端斷開連接時被發送,因此我編寫了一個inetd python腳本來測試幾個服務器(一個inetd和另一個xinetd),因此您可以使用它檢查發送的信號。 它只是將找到的內容記錄到/var/log/test.log中。 也許會有用。
#!/usr/bin/python
import os, signal, sys
skip = ["SIGKILL", "SIG_DFL", "SIGSTOP", "SIG_IGN", "SIGCLD", "SIGCHLD"]
name_map = {}
identifiers = [i for i in dir(signal) if i.startswith("SIG") and not i in skip]
for i in identifiers:
name_map[getattr(signal, i)] = i
def handler(num, frame):
signame = name_map[num]
os.system("echo handled %s >> /var/log/test.log" % signame)
if __name__ == "__main__":
for id, name in name_map.iteritems():
signal.signal(id, handler)
while True:
print sys.stdin.readline()
sys.stdout.flush()
監視發送到您的過程的信號。 也許您的腳本沒有響應xinet發送的SIGHUP,監視信號並使其消失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.