एक निश्चित पोर्ट पर सुनने की प्रक्रिया को निर्धारित करें


101

जैसा कि शीर्षक कहता है, मैं कई गेम सर्वर चला रहा हूं, और उनमें से प्रत्येक में समान nameलेकिन अलग PIDऔर portसंख्या है। मैं PIDउस सर्वर से मेल खाना चाहूंगा जो कुछ पोर्ट पर सुन रहा है, और फिर मैं इस प्रक्रिया को मारना चाहूंगा। मुझे अपनी बैश स्क्रिप्ट को पूरा करने की आवश्यकता है।

क्या यह भी संभव है? क्योंकि यह अभी तक वेब पर कोई समाधान नहीं मिला।

जवाबों:


125

-pका झंडा netstatआप इस प्रक्रिया के पीआईडी देता है:

netstat -l -p

संपादित करें: फ्रीबीएसडी में सॉकेट उपयोगकर्ताओं के पीआईडी ​​प्राप्त करने के लिए आवश्यक कमांड है sockstat। जैसा कि हमने @ चक्रवात के साथ चर्चा के दौरान काम किया, वह रेखा जो काम करती है:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1

2
netstat: 80: unknown or uninstrumented protocol80purpoes परीक्षण के लिए (nginx) बंदरगाह का इस्तेमाल किया । काम नहीं किया।
चक्रवात

5
netstat -nlp | grep :80इसके बजाय प्रयास करें
stanwise

12
netstat: option requires an argument -- p
चक्रवात

2
साइजविन पर @jasonbrittain, विंडोज़ को देशी netstatकहा जाता है। इसका अन्य वाक्य विन्यास है।
स्टैनवाइज

2
यह उत्तर गलत है: netstat: विकल्प के लिए तर्क की आवश्यकता होती है - p
अच्छा व्यक्ति

143

लघु संस्करण जिसे आप कमांड को मारने के लिए पास कर सकते हैं:

lsof -i:80 -t

13
इसमें ऐसी प्रक्रियाएं भी शामिल हैं जो उस पोर्ट पर जुड़ी हुई हैं । lsof -i4TCP:80 -sTCP:LISTEN -tइसके बजाय शायद आप क्या चाहते हैं।
नेविर

ठीक वही जो मेरे द्वारा खोजा जा रहा था। मैं उस पोर्ट की खोज कर एक प्रक्रिया को मारना चाहता था जो यह चल रहा है।
पौराणिक

@ Nevir आपका क्या मतलब है "इसमें उस पोर्ट पर जुड़ी प्रक्रियाएँ भी शामिल हैं"? क्या आप समझा सकते हैं?
किश्नर 747

2
kill -9 `lsof -i:80 -t`नकल की आसानी के लिए
bmjrowe

17

netstat -p -l | grep $PORTऔर lsof -i :$PORT समाधान अच्छे हैं लेकिन मैं पाइप के साथ fuser $PORT/tcpPOSIX (जो काम करता हूं coreutils) के लिए एक्सटेंशन सिंटैक्स पसंद करता हूं :

pid=`fuser $PORT/tcp`

यह शुद्ध पिड प्रिंट करता है ताकि आप sedजादू छोड़ सकें ।

एक चीज जो fuserमेरे प्रेमी को उपकरण बनाती है, वह उस प्रक्रिया को सीधे सिग्नल भेजने की क्षमता है (यह सिंटैक्स POSIX के लिए भी विस्तार है):

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

Also -k FreeBSD द्वारा समर्थित है: http://www.freebsd.org/cgi/man.cgi?query=fuser



10

netstat -nlp आपको यह बताना चाहिए कि किस पोर्ट पर क्या सुनना है।


1
netstat: 80: unknown or uninstrumented protocol80purpoes परीक्षण के लिए (nginx) बंदरगाह का इस्तेमाल किया । काम नहीं किया।
चक्रवात

3

चूँकि sockstat मूल रूप से मेरी मशीन पर स्थापित नहीं था, इसलिए मैंने netstat का उपयोग करने के लिए stanwise के उत्तर को हैक कर लिया।

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""

3

मैं प्रोग्रामिक रूप से - केवल बैश का उपयोग करना चाहता था - किसी दिए गए पोर्ट पर सुनने की प्रक्रिया को मारना।

मान लें कि पोर्ट 8089 है, तो यहाँ है कि मैंने इसे कैसे किया:

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

मैं उम्मीद करता हूं कि इससे किसी की मदद होगी! मुझे पता है कि यह मेरी टीम की मदद करने वाला है।


1
यहाँ वह कार्य है जो मैं इसे करने के लिए करता हूँ: function kill-listener { lsof -i:$1 -t | xargs kill -9 }अपने पोर्ट 8089 के उदाहरण का उपयोग करते हुए:kill-listener 8089
तूफान हैमिल्टन

3

वाक्य - विन्यास:

किल -9 $ (lsof -t -i: portnumber)

उदाहरण: पोर्ट 4200 पर चल रही प्रक्रिया को मारने के लिए, कमांड का पालन करें

kill -9 $(lsof -t -i:4200)

उबंटू में परीक्षण किया गया।


2

खिड़कियों पर, नेट का विकल्प pid's -o और -p प्राप्त करने के लिए एक प्रोटोकॉल फ़िल्टर का चयन करता है, उदा .: netstat -a -p tcp -o

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