2010-10-16 23 views
8

मेरे पास red5 server (जावा) मेरे लिनक्स सर्वर पर चल रहा है।लिनक्स: पोर्ट 1 9 35 का उपयोग करने वाले प्रोग्रामों को कैसे मारें?

कभी-कभी, सर्वर बंद हो जाता है। जब मैं इसे पुनरारंभ करने का प्रयास करता हूं तो मुझे एक त्रुटि मिली:

"बाध्यकारी त्रुटि, यह पोर्ट उपयोग में अलौकिक है"। एक ही त्रुटि:

तो मैं killall -9 जावा के साथ सर्वर को मारने और सर्वर को पुनः आरंभ करने की कोशिश करने का प्रयास करें।

मुझे थोड़ी देर इंतजार करना है (लगभग 2-3 मिनट) और इसे फिर से शुरू करें: यह काम करता है।

मुझे सिर्फ यह जानने की जरूरत है कि जब मैं प्रक्रिया को मारता हूं तो मुझे अभी भी बंदरगाह 1 9 35 से 2-3 मिनट पहले इंतजार करना पड़ता है और मैं सर्वर को फिर से चला सकता हूं।

क्या इस प्रक्रिया को तुरंत मारने और बंदरगाह मुक्त करने का कोई तरीका है?

+1

मुझे नहीं पता उन उत्तरों पर विश्वास करें जो बंदरगाह के असफल सफाई के लिए सिगकिल को दोषी ठहराते हैं। ओएस पूरी तरह से जानता है कि प्रक्रिया समाप्त हो गई है और अपने संसाधनों को मानक तरीके से छोड़ देता है। किसी भी बंद टीसीपी सुनो पोर्ट के लिए मानक तरीका गलत सर्वर से कनेक्ट को रोकने के लिए कुछ समय के लिए उपलब्ध नहीं होना चाहिए। जस्टिन के जवाब में उल्लिखित SO_REUSEADDR का उपयोग करके इसे आसानी से टाला जा सकता है। –

उत्तर

16

आप अपने सर्वर के बारे में सुनिश्चित पुराने उदाहरण बंदरगाह रखती है, तो बस jps चलाने के लिए, सूची में अपने सर्वर पीआईडी ​​खोजने के लिए और चलाने के kill -9 my_pid

सामान्य गैर जावा प्रक्रिया के लिए, lsof -i :1935 आमतौर पर मेरे लिए काम करता है। फिर, पिड लें और इस प्रक्रिया को मार दें।

5

यदि संभव हो, तो आपको सॉकेट SO_REUSEADDR विकल्प का उपयोग करना चाहिए जब आपका प्रोग्राम अपनी सॉकेट सेट करता है। जब आप प्रोग्राम को पुनरारंभ करते हैं तो 2-3 मिनट तक प्रतीक्षा करने के बजाय, आप तुरंत सॉकेट का पुन: उपयोग कर सकते हैं।

अधिक जानकारी के लिए javadoc setReuseAddress देखें। विशेष रूप से:

When a TCP connection is closed the connection may remain in a timeout state for a period of time after the connection is closed (typically known as the TIME_WAIT state or 2MSL wait state). For applications using a well known socket address or port it may not be possible to bind a socket to the required SocketAddress if there is a connection in the timeout state involving the socket address or port.

Enabling SO_REUSEADDR prior to binding the socket using bind(SocketAddress) allows the socket to be bound even though a previous connection is in a timeout state.

+0

वह setReuseAddress को कॉल करके जावा में ऐसा कर सकता है http://download.oracle.com/javase/1.4.2/docs/api/java/net/ServerSocket.html –

+0

ऐसा लगता है कि हम दोनों एक ही चीज़ सोच रहे थे - मेरा देखें संपादन :) –

9

समस्या को मारने में है।

यदि आप सिगकिल (-9) का उपयोग कर प्रक्रिया को मार देते हैं, तो प्रक्रिया तुरंत समाप्त हो जाती है। तो बंदरगाह तब तक आवंटित रहता है जब तक (कुछ मिनट बाद) ओएस समस्या को नोटिस करता है। SIGKILL से पहले SIGHUP और SIGINT (क्रम में) आज़माएं।

किसी भी मामले में, यह सत्यापित करने के लिए कि किस प्रक्रिया ने पोर्ट को अधिग्रहित किया है, netstat -a -t -p का उपयोग करें।

1

kill -9 डिफ़ॉल्ट रूप से उपयोग नहीं किया जाना चाहिए। प्रक्रिया आंतरिक चीजों को साफ नहीं कर सकती है। उदाहरण के बंदरगाह 8000 द्वारा उपयोग करते हुए आवेदन की पीआईडी ​​को मारने के लिए:

kill $(netstat -nptl | awk '/:8000/{gsub("/.*", ""); print $7}') 
+0

मार: उपयोग: मारो [-s sigspec | -एन साइनम | -sigspec] पिड | jobspec ... या kill -l [sigspec] – yarek

+0

लगता है कि इस कमांड में कोई त्रुटि है: kill: use: kill [-s sigspec | -एन साइनम | -sigspec] पिड | jobspec ... या kill -l [sigspec] – yarek

1

यह एक आसान oneliner है:

kill $(fuser 1935/tcp) 
7

तुरंत की प्रक्रिया समाप्ति और बंदरगाह रिहाई:

fuser -k 1935/tcp