【发布时间】:2012-11-27 13:56:04
【问题描述】:
重新启动运行侦听 TCP 端口的应用程序的最佳方法是什么? 问题是:如果我在重新启动时快速启动应用程序,它会失败,因为正在侦听的套接字已在使用中。
这种情况下如何安全重启?
socket.error: [Errno 98] Address already in use
代码:
#!/usr/bin/python
import sys,os
import pygtk, gtk, gobject
import socket, datetime, threading
import ConfigParser
import urllib2
import subprocess
def server(host, port):
sock = socket.socket()
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((host, port))
sock.listen(1)
print "Listening... "
gobject.io_add_watch(sock, gobject.IO_IN, listener)
def listener(sock, *args):
conn, addr = sock.accept()
print "Connected"
gobject.io_add_watch(conn, gobject.IO_IN, handler)
return True
def handler(conn, *args):
line = conn.recv(4096)
if not len(line):
print "Connection closed."
return False
else:
print line
if line.startswith("unittest"):
subprocess.call("/var/tmp/runme.sh", shell=True)
else:
print "not ok"
return True
server('localhost', 8080)
gobject.MainLoop().run()
runme.sh
#!/bin/bash
ps aux | grep py.py | awk '{print $2}' | xargs kill -9;
export DISPLAY=:0.0 && lsof -i tcp:58888 | grep LISTEN | awk '{print $2}' | xargs kill -9;
export DISPLAY=:0.0 && java -cp Something.jar System.V &
export DISPLAY=:0.0 && /var/tmp/py.py &
编辑: 请注意,我将 Java 和 Python 作为一个具有两层的应用程序一起使用。所以 runme.sh 是我同时启动两个应用程序的启动脚本。在 Java 中,我按下 Python 重新启动按钮。但是 Python 不会重新启动,因为 kill 是通过 BASH 完成的。
【问题讨论】:
-
那么你知道为什么你的代码没有设置
SO_REUSEADDR吗? -
@MatthewAdams:还没有。还是失败了。
-
我现在已经查看了大量关于同一问题的其他问题,似乎 EJP 关于
SO_REUSEADDR是完全正确的。我仍然不明白为什么您的代码无法立即重新连接,因为看起来您正在设置SO_REUSEADDR... -
我认为它必须与
gobject的 io 监控有关... -
你能把套接字的文件描述符传递给另一个新进程吗?
标签: python linux network-programming python-2.7