एप्लिकेशन को फिर से लॉन्च करने का सबसे अच्छा तरीका क्या है जहां यह एक टीसीपी पोर्ट सुन रहा था? समस्या यह है: यदि मैं एप्लिकेशन को तुरंत लॉन्च करता हूं तो इसे विफल करता है क्योंकि सॉकेट जो सुन रहा था वह पहले से ही उपयोग में है।पायथन - एप्लिकेशन को फ्लाई पर एप्लिकेशन को फिर से लॉन्च करने के लिए कैसे करें जबकि एप्लिकेशन को सुनने मोड में एक टीसीपी पोर्ट है?
ऐसे मामले में सुरक्षित रूप से फिर से लॉन्च कैसे करें?
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 &
संपादित करें: ध्यान दें कि, मैं जावा और अजगर का उपयोग कर रहा दो परत के साथ एक आवेदन के रूप में एक साथ। तो runme.sh एक ही समय में दोनों ऐप्स लॉन्च करने के लिए मेरी स्टार्टअप स्क्रिप्ट है। जावा से मैं पायथन रिलांच बटन दबाता हूं। लेकिन पाइथन फिर से लॉन्च नहीं होता क्योंकि हत्या बाश के माध्यम से की जाती है।
तो क्या आपको पता चला कि आपका कोड 'SO_REUSEADDR' क्यों सेट नहीं कर रहा था? –
@ मैथ्यूएडम्स: अभी तक नहीं। अभी भी यह विफल रहता है। – YumYumYum
मैंने अब इसी मुद्दे के बारे में अन्य प्रश्नों पर एक टन देखा है, और ऐसा लगता है कि ईजेपी 'SO_REUSEADDR' के बारे में बिल्कुल सही है। मुझे अभी भी नहीं पता है कि आपका कोड तत्काल क्यों कनेक्ट नहीं हो सकता है क्योंकि ऐसा लगता है कि आप 'SO_REUSEADDR'' सेट कर रहे हैं ... –