Каков наилучший способ перезапуска приложения, в котором он запускал 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 &
EDIT: Обратите внимание, что я использую Java и Python вместе как одно приложение с двумя слоями. Итак, runme.sh - это мой запуск script для запуска обоих приложений одновременно. Из Java я нажимаю кнопку перезапуска Python. Но Python не перезапускает, потому что kill выполняется через BASH.