簡體   English   中英

python xinetd客戶端斷開連接處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM