nc -zv my-host 50010
,但我想进行两个改进:1)在x秒后,将线程死在X秒后,2)像守护程序一样将线程运行在后地面上,以便我的脚本将退出并使线程运行。我一直在试图弄清楚这几天,我在哪里没有。 请帮忙!
,但我想进行两个改进:1)在x秒后,将线程死在X秒后,2)像守护程序一样将线程运行在后地面上,以便我的脚本将退出并使线程运行。
我想建议您真的不想做(2)。您可以将背景内容留在外壳中,而不必在代码中担心。这意味着您可以这样写代码:
#!/usr/bin/python3
import argparse
import concurrent.futures
import socket
class Listener:
def __init__(self, port: int, timeout: float = 10):
self.port = port
self.timeout = timeout
def run(self):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(self.timeout)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("", self.port))
s.listen(1)
try:
print(f"Waiting for connection on port {self.port}")
conn, addr = s.accept()
print(addr, conn)
except TimeoutError:
print(f"Listener on {self.port} timed out.")
def main():
p = argparse.ArgumentParser()
p.add_argument("--timeout", "-t", type=float, default=10)
p.add_argument("ports", nargs="+", type=int)
args = p.parse_args()
pool = concurrent.futures.ThreadPoolExecutor()
tasks = []
for port in args.ports:
l = Listener(port, timeout=args.timeout)
tasks.append(pool.submit(l.run))
concurrent.futures.wait(tasks)
if __name__ == "__main__":
main()
如果您真的想处理代码中的背景,那么您可能会使用简单的python listener.py 100 200 300 &
os.fork
daemonize
模块,因为您的目标不是真正写守护程序;您想要期望写入终端的东西。看起来像这样:
#!/usr/bin/python3
import socket
import os
class Listener:
def __init__(self, port: int, timeout: float = 10):
self.port = port
self.timeout = timeout
def run(self):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(self.timeout)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("", self.port))
s.listen(1)
try:
print(f"Waiting for connection on port {self.port}")
conn, addr = s.accept()
print(addr, conn)
except TimeoutError:
print(f"Listener on {self.port} timed out.")
def main():
p = argparse.ArgumentParser()
p.add_argument("--timeout", "-t", type=float, default=10)
p.add_argument("ports", nargs="+", type=int)
args = p.parse_args()
for port in args.ports:
listener = Listener(port, timeout=args.timeout)
pid = os.fork()
if pid == 0:
listener.run()
return
if __name__ == "__main__":
main()
运行该代码(并连接到另一个终端的听力端口)看起来像这样:$ python listener.py 2001 2002 2003
Waiting for connection on port 2001
Waiting for connection on port 2002
Waiting for connection on port 2003
$ ('127.0.0.1', 51466) <socket.socket fd=4, family=2, type=1, proto=0, laddr=('127.0.0.1', 2001), raddr=('127.0.0.1', 51466)>
('127.0.0.1', 44602) <socket.socket fd=4, family=2, type=1, proto=0, laddr=('127.0.0.1', 2002), raddr=('127.0.0.1', 44602)>
('127.0.0.1', 38672) <socket.socket fd=4, family=2, type=1, proto=0, laddr=('127.0.0.1', 2003), raddr=('127.0.0.1', 38672)>
$ py listener.py 2001 2002 2003
Waiting for connection on port 2001
Waiting for connection on port 2002
Waiting for connection on port 2003
$ Listener on 2003 timed out.
Listener on 2001 timed out.
Listener on 2002 timed out.