मैं उस प्रक्रिया को कैसे मार सकता हूं जो मर चुकी है लेकिन सुन रही है?


48

मैं एक ऐप विकसित कर रहा हूं जो पोर्ट 3000 पर सुनता है। जाहिर है कि इसका एक उदाहरण अभी भी पोर्ट को सुन रहा है क्योंकि जब भी मैं इसे शुरू करता हूं, यह एक श्रोता (C #, TcpListener, लेकिन यह अप्रासंगिक नहीं) बना सकता है क्योंकि पोर्ट पहले से ही है लिया।

अब, एप्लिकेशन टास्क मैनेजर में मौजूद नहीं है, इसलिए मैंने इसका पीआईडी ​​खोजने और इसे मारने की कोशिश की, जिससे यह दिलचस्प परिणाम हुआ:

C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116
ERROR: The process "3116" not found.

मैंने पहले इस व्यवहार को नहीं देखा है और लगा कि यह देखना दिलचस्प है कि क्या किसी के पास कोई समाधान है।

अद्यतन: मैंने प्रोसेस एक्सप्लोरर शुरू किया और 3000 की खोज की और यह पाया:

<Non-existent Process>(3000): 5552

मैंने उस पर राइट क्लिक किया और "क्लोज हैंडल" चुना। यह प्रोसेस एक्सप्लोरर में नहीं है, लेकिन फिर भी नेटस्टैट में दिखाई देता है और फिर भी श्रोता को शुरू करने से रोकता है।

अद्यतन 2: Windows के लिए TCPView पाया गया जो इस प्रक्रिया को दिखाता है "<non-existent>"। CurrPorts की तरह, जब मैं इस टूल में कनेक्शन बंद करने की कोशिश करता हूं तो कुछ भी नहीं होता है।


रोगी को मारने से बीमारी ठीक हो जाती है, लेकिन यदि आप कंप्यूटर को पुनरारंभ करते हैं तो क्या यह बंद हो जाता है?
Xantec

2
वास्तव में, फिर से लॉग आउट करना और वापस जाना पर्याप्त था, लेकिन मैं अब इसे पुन: पेश करने में कामयाब रहा हूं इसलिए मैं अब भी एक बेहतर समाधान ढूंढना चाहता हूं ...
श्रेकेल

यदि प्रोग्रामों में से किसी सूचीबद्ध की जाँच करें यहाँ मदद
Sathyajith भट्ट

1
टीसीपी व्यू 3.05 के मौजूदा संस्करण के साथ <non-exsitent> प्रक्रिया के संदर्भ मेनू से "कनेक्शन बंद करें" प्रक्रिया ने मेरे मामले में कनेक्शन को सफलतापूर्वक बंद कर दिया और पोर्ट को मुक्त कर दिया।
वेण्टी कुनेव

1
यह भी देखें serverfault.com/questions/181015/...
rogerdpack

जवाबों:


13

सॉकेट पर अंतहीन प्रतीक्षा से बचने के लिए, आपके प्रोग्राम को SO_REUSEADDR और SO_RCVTIMEO मापदंडों के साथ सेटोस्कॉप फ़ंक्शन का उपयोग करना चाहिए :

SO_REUSEADDR : Allows the socket to be bound to an address that is already in use.
SO_RCVTIMEO : Sets the timeout, in milliseconds, for blocking receive calls. 

1
क्या इस विशेष मुद्दे के साथ किसी ने मदद की (मृत प्रक्रिया द्वारा सॉकेट सुनना)?
रस्टेक्स

12

हमारे पास समान समस्या थी और प्रक्रिया आईडी को देखने के लिए Microsoft Sysinternals से प्रोसेस एक्सप्लोरर का उपयोग किया गया था जो अब अस्तित्व में नहीं है।

यह पता चला है कि इस प्रक्रिया को कई DrWatson प्रक्रियाओं द्वारा संदर्भित किया गया था। उन प्रक्रियाओं को मारना बंदरगाह जारी किया। DrWatson का उपयोग Microsoft को मेमोरी डंप भेजने के लिए किया जाता है और इसमें कई घंटे लग रहे थे क्योंकि उस प्रक्रिया ने उस समय कई दसियों GB मेमोरी को क्रैश कर दिया था।


7

मुझे लगता है कि आपको CurrPorts को एक कोशिश देना चाहिए

CurrPorts नेटवर्क मॉनिटरिंग सॉफ्टवेयर है जो आपके स्थानीय कंप्यूटर पर वर्तमान में खोले गए सभी टीसीपी / आईपी और यूडीपी पोर्ट की सूची प्रदर्शित करता है। सूची में प्रत्येक बंदरगाह के लिए, पोर्ट खोलने वाली प्रक्रिया के बारे में जानकारी भी प्रदर्शित की जाती है, जिसमें प्रक्रिया का नाम, प्रक्रिया का पूर्ण पथ, प्रक्रिया की संस्करण जानकारी (उत्पाद का नाम, फ़ाइल विवरण, और इसी तरह) शामिल है, समय प्रक्रिया बनाई गई थी, और उपयोगकर्ता जो इसे बनाया था।

इसके अलावा, CurrPorts आपको अवांछित TCP कनेक्शन बंद करने, पोर्ट खोलने वाली प्रक्रिया को मारने और HTML फ़ाइल, XML फ़ाइल, या टैब-सीमांकित पाठ फ़ाइल में टीसीपी / यूडीपी पोर्ट जानकारी को बचाने की अनुमति देता है।

CurrPorts स्वचालित रूप से गुलाबी रंग के संदिग्ध टीसीपी / यूडीपी बंदरगाहों के साथ चिह्नित होते हैं जो अज्ञात अनुप्रयोगों के स्वामित्व वाले हैं (संस्करण जानकारी और आइकन के बिना अनुप्रयोग)

वैकल्पिक शब्द


4
यह प्रक्रिया "सिस्टम" नाम के तहत सूची में दिखाई देता है। मैंने पोर्ट को बंद करने के लिए आइटम पर राइट क्लिक करने की कोशिश की, लेकिन ऐसा कुछ नहीं हुआ।
श्रेकेल

7

संभावित समस्या यह है कि आपकी प्रक्रिया ने एक और (बच्चा) प्रक्रिया शुरू की है जो सॉकेट हैंडल को विरासत में मिली है, और यह अभी भी चल रही है।

इसे रोकने के विभिन्न तरीके हैं, उदाहरण के लिए: ProcessStartInfo.UseShellExecute = true;


1
धन्यवाद, यह एक अच्छा था। मैं subprocess.call(..., cwd=..., shell=True)एक अजगर वेब सर्वर में ऐप-लॉन्चर के रूप में कॉल कर रहा था , और यह पता चला कि मुझे सॉकेट को मुक्त करने के लिए उन सभी बच्चे प्रक्रियाओं को मारना था। अजीब बात यह है कि मैं शेल = ट्रू का उपयोग कर रहा हूं। इसने मुझे उम्र भर परेशान किया।
डैनियल एफ

मुझे नहीं लगता कि शेल के उपयोग से इस व्यवहार का परिणाम मिलता है। आप जब माता-पिता मरता, मुझे लगता है कि सही तरीका एक बनाने के लिए है सभी चाइल्ड प्रक्रियाओं समाप्त करना चाहते हैं नौकरी वस्तु के साथ JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE झंडा , साथ प्रत्येक बच्चे प्रक्रिया जोड़ने AssignProcessToJobObject , और पास स्वाभाविक रूप से जब जनक प्रक्रिया रास्ते को संभाल सकते हैं।
किरिस

1

क्या आप प्रोसेस एक्सप्लोरर में प्रक्रिया देख सकते हैं ? यदि हाँ, तो आप इसे वहां से मार सकते हैं, लेकिन केवल यह जांचने के बाद कि यह वास्तव में क्या है (आप प्रक्रिया में लोड किए गए सभी डीएल देख सकते हैं)


1

अपने netstat कमांड पर '-b' झंडा फेंकने का प्रयास करें। यह आपको निष्पादन योग्य का नाम बताएगा जो पोर्ट का उपयोग कर रहा है। फिर उस कार्य प्रबंधक में खरीद लें और उसे वहां मार दें। यदि वह कार्य पोस्ट नहीं करता है तो निष्पादन योग्य क्या है जो पोर्ट को खुला रखता है।


मैं इस समय इसे पुन: पेश नहीं कर सकता, लेकिन मुझे पूरा यकीन है कि चूंकि प्रक्रिया का नाम खोजने की कोशिश में हर दूसरे प्रयास (और उपकरण) विफल रहे हैं, इसलिए नेटस्टैट ऐसा करने में सक्षम नहीं होगा।
श्रेकेल

1

यहाँ शब्द linger का उल्लेख करने की आवश्यकता है।

विवरण http://msdn.microsoft.com/en-us/library/ms739165.aspx पर देखे जा सकते हैं

संक्षेप में: एक विकल्प है जो सॉकेट सिस्टम को बताता है कि एक सॉकेट खुला रखने के बाद भी बंद हो गया है यदि असंतुलित डेटा मौजूद है।

अपने C # ऐप में आप सॉकेट के माध्यम से किसी भी संबंधित विकल्प को निर्दिष्ट कर सकते हैं। SetSocketOption: http://msdn.microsoft.com/en-us/library/1011kecd.aspx

चूंकि उल्लिखित सभी सामान भेजने और ग्राहकों से संबंधित है, लेकिन हमारे पास काम पर समान मुद्दे थे, कुछ और खोज ने यह खुलासा किया कि कोई श्रोताओं के लिए लिंग विकल्प को निर्दिष्ट कर सकता है जैसा कि यहां उदाहरण में दिखाया गया है: http://msdn.microsoft.com /library/system.net.sockets.tcplistener.server.aspx

कुछ सहयोगियों ने आवेदन समाप्ति / समापन के बाद ओएस द्वारा लगभग दो मिनट के लिए बंद किए जाने वाले बंदरगाहों के बारे में बात की। यह देखते हुए, यह सुनना दिलचस्प होगा कि क्या पोर्ट एक निश्चित समय के बाद भी आयोजित किया जाता है।


बंदरगाहों की तुलना में बहुत लंबे समय तक खुला रखा गया था (याद नहीं है कि कितना समय तक लेकिन शायद एक घंटे पहले तक मैंने छोड़ दिया और रिबूट हो गया)।
श्रेकेल

मुझे यकीन नहीं है कि अगर लिंग विकल्प इस विशेष मामले के लिए प्रासंगिक है, क्योंकि ऐसा लगता है कि यह केवल निर्दिष्ट करता है कि क्लोजबोर्ड के लिए कॉल के बाद क्या होना चाहिए। चूंकि मैं एप्लिकेशन को मार रहा हूं, इसलिए मुझे संदेह है कि फ़ंक्शन को (?) कहा जाता है।
श्रेकेल

1

मैं भी इस मुद्दे का सामना करता हूं। अंत में मुझे मेरा कारण मिल गया। यह मुख्य प्रक्रिया के कारण c / c ++ में पोप द्वारा एक बच्चे की प्रक्रिया को लागू करने के कारण होता है। लेकिन मुख्य प्रक्रिया दुर्घटना / शटडाउन से पहले शट डाउन। फिर बंदरगाह मुख्य प्रक्रिया को अभी भी लाइव व्यवहार करेगा और अभी भी उस पर सुनेंगे।


1
मैंने
सर्वरफॉल्ट

1

मुझे xdebug के साथ भी यही समस्या थी, इसने पोर्ट 9000 को खुला छोड़ दिया।

मैं "टास्ककिल / पिड xxxx" का उपयोग करके cmd के साथ बंद होने में कामयाब रहा।

पोर्ट का उपयोग करने वाली प्रक्रिया की पीड को "नेटस्टैट -ओ" के साथ पुनः प्राप्त किया जा सकता है।

मेरा कॉन्फ़िगरेशन 7 होम प्रीमियम जीता था।


1

मेरे पास एक ही समस्या थी और इसे इसके द्वारा तय किया गया था:

  • पीआईडी ​​के साथ मिल रहा है netstat -o
  • इसे प्रोसेस xp से मारें

यह ध्यान रखना दिलचस्प है कि नेटस्टैट कभी-कभी एक पीआईडी ​​लौटा सकता है लेकिन संबंधित निष्पादन योग्य नाम नहीं!


1

समस्या हो सकती है अगर मृत प्रक्रिया एक या एक से अधिक बच्चे की प्रक्रिया शुरू कर दी है। अगर

BOOL WINAPI CreateProcess(
_In_opt_    LPCTSTR               lpApplicationName,
_Inout_opt_ LPTSTR                lpCommandLine,
_In_opt_    LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_    LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_        BOOL                  bInheritHandles,
_In_        DWORD                 dwCreationFlags,
_In_opt_    LPVOID                lpEnvironment,
_In_opt_    LPCTSTR               lpCurrentDirectory,
_In_        LPSTARTUPINFO         lpStartupInfo,
_Out_       LPPROCESS_INFORMATION lpProcessInformation
);

एक बच्चे की प्रक्रिया शुरू करने के लिए इस्तेमाल किया गया था, यह विरासत के हैंडल के मूल्य पर निर्भर करता है, इसलिए

bInheritHandles = false 

यदि पैरेंट प्रक्रिया बंद कर दी गई है और क्लाइंट प्रक्रिया अभी भी चल रही है, तो Windows पोर्ट को ब्लॉक नहीं करेगा।


1

इसी तरह के मुद्दे को देखा जब मूल कारण कुछ बाल प्रक्रिया थी जो बंदरगाहों को विरासत में मिली, मूल प्रक्रिया दुर्घटनाग्रस्त हो गई, जबकि बाल प्रक्रिया अभी भी बंदरगाह को पकड़े हुए थी। संकल्प था कि अभी भी चल रही बाल प्रक्रिया की पहचान करना और उसे रोकना। यहां उदाहरण में गैर-मौजूदा प्रक्रिया पीआईडी ​​7336 थी

> wmic process get processid,parentprocessid | findstr/i 7336
7336             23828

इस प्रक्रिया को रोकने के लिए:

> taskkill /f /pid 23828

और इस मुद्दे को हल किया।


0

मुझे नहीं लगता कि आपके पास कोई फ़ायरवॉल स्थापित है (या किसी भी विंडोज नेटवर्किंग tweeks की कोशिश की)?

कुछ फायरवॉल इस तरह के व्यवहार का प्रदर्शन करते हैं और बंदरगाहों को खुला रख सकते हैं।

यदि आपके पास एक है, तो इसे अक्षम करने का प्रयास करें और फिर अपने कार्यक्रम को लॉन्च करें और इसे बंद करें और देखें कि क्या होता है।


वास्तव में दुर्भाग्य से एक विकल्प नहीं है, क्योंकि मेरे पास अपने कंप्यूटर पर फ़ायरवॉल का नियंत्रण नहीं है।
श्रेकेल

@ ट्रेक - यह कौन सी फ़ायरवॉल है? जैसा कि आपको समस्या हो रही है, मैं व्यक्तिगत रूप से यह सोचूंगा कि यह समस्या है।
विलियम हिल्सम

0

चूंकि आपकी प्रक्रिया सिस्टम के रूप में सूचीबद्ध है, इसलिए संभव है कि आप इसे "सिस्टम" कमांड प्रॉम्प्ट पर मार सकते हैं। सिस्टम खाते में एक नियमित व्यवस्थापक की तुलना में अधिक विशेषाधिकार हैं।

आप cmd.exe के लिए किसी कार्य को शेड्यूल करके "सिस्टम" cmd.exe प्राप्त कर सकते हैं (शेड्यूलर सिस्टम के रूप में चलता है):

at 15:23 /interactive "cmd.exe" 

निकट भविष्य में किसी चीज़ के लिए उस समय को बदलें। सुनिश्चित करें कि आप मशीन कंसोल पर हैं (यदि आप नियमित टर्मिनल सर्वर सत्र पर हैं, तो आपको नया cmd.exe नहीं दिखेगा। mstscकंसोल पर लॉगिन करें )। मुझे लगता है कि ऐसा करने के अन्य तरीके हैं, लेकिन इसने मेरे लिए अतीत में काम किया।


0

मुझे भी बिल्कुल यही समस्या है। यह प्रक्रिया क्रैश होने के समय डिबग की जा रही थी, और अभी भी एक निलंबित स्थिति में एक vsjitdebugger.exe प्रक्रिया थी, जो स्पष्ट रूप से डीबग की जा रही प्रक्रिया को संदर्भित करती है। उस vsjitdebugger.exe प्रक्रिया को मारना समस्या को हल करता है।


0

TCPView और प्रोसेस एक्सप्लोरर के हाइब्रिड उपयोग ने मेरे लिए काम किया;) मैंने पहली बार उस प्रोसेस आईडी को देखा, जो TCPView में पोर्ट का उपयोग कर रही थी। प्रक्रिया एक्सप्लोरर में प्रक्रिया को अलग कर दिया और प्रक्रिया एक्सप्लोरर का उपयोग करके प्रक्रिया को मार डाला।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.