因业务需要,需监听tcp端口
def tcpListener():
#建立tcp头
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
sock.bind(('0.0.0.0', 8888))
#最大连接数
sock.listen(5)
while True:
try:
#获取连接
session, addr = sock.accept()
conn = Server();
t = threading.Thread(target=conn.connect, args=(session, addr))
t.daemon = True
t.start()
except Exception, e:
logger.error(traceback.format_exc())
将该监听嵌入到主进程server.py当中
#监听tcp端口 t = MyThread(target=tcpListener) t.setDaemon(True) t.start() #do something...
当中有业务需要执行shell脚本重启主进程
subprocess.Popen((u'nohup sh restart.sh', shell=True
, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
启动时发现错误,端口被占用
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/mnt/hgfs/workspace/octopus/jtools/server.py", line 18, in ssh_server_main
sock.bind(('0.0.0.0', int(port)))
File "/usr/lib64/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
error: [Errno 98] Address already in use
netstat -nultp查看端口发现,端口绑定到了一些奇怪的服务上面。经资料查询,开启子进程的时候,子进程会继承父进程的文件描述符。加入close_fds=True参数,让子进程不继承文件描述符即可解决
subprocess.Popen((u'nohup sh restart.sh', shell=True
, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
参考资料:Python subprocess.Popen() - subprocess causes sockets to remain open - Stack Overflow



