リスニング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を2つのレイヤーを持つ1つのアプリケーションとして一緒に使用していることに注意してください。つまり、runme.shは、両方のアプリを同時に起動するためのスタートアップスクリプトです。JavaからPythonの再起動ボタンを押します。ただし、強制終了はBASHを介して行われるため、Pythonは再起動しません。