重新启动运行侦听 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()
运行me.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 完成的。