मैक पर (3000) लॉकिंग पोर्ट को ढूंढें (मारें)


1807

मैं अपने टीसीपी पोर्ट्स को सुनने / उपयोग करने वाली प्रक्रियाओं को कैसे (और मार) पाता हूँ? मैं मैक ओएस एक्स पर हूं।

कभी-कभी, एक दुर्घटना या कुछ बग के बाद, मेरा रेल ऐप 3000 पोर्ट को लॉक कर रहा है। मैं इसे ps -ef का उपयोग करके नहीं ढूँढ सकता ...

जब कर रहे हो

rails server

मुझे मिला

पहले से ही उपयोग में लिया गया पता - bind (2) (Errno :: EADDRINUSE)

2014 अपडेट:

नीचे दिए गए कुछ जवाबों को पूरा करने के लिए: मारने के आदेशों को निष्पादित करने के बाद, पीआईडी ​​फ़ाइल को हटाना आवश्यक हो सकता है rm ~/mypath/myrailsapp/tmp/pids/server.pid


25
किसी भी उपयोगकर्ता-निर्दिष्ट पोर्ट पर एक प्रक्रिया को मारने के लिए एक बहुत साफ समाधान @ केविन सुटल के जवाब में पाया जा सकता है। function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
पश्चात के

4
पोर्ट 3000 'अत्यधिक रेल विकास विशिष्ट नहीं है' - उल्का मूल रूप से 3000 पर भी चलता है, और मुझे यकीन है कि अन्य लोग भी हैं।
gregorvand

@ user456584 ऊपर की टिप्पणी को स्वीकार किए गए उत्तर होना चाहिए ^ ^ ^ ^ एक पोर्ट पर चलने वाली कई प्रक्रियाओं को मारने के लिए उस फ़ंक्शन ने काम किया
Anueway

जवाबों:


3019
  1. तुम कोशिश कर सकते हो netstat

    netstat -vanp tcp | grep 3000
    
  2. के लिए MacOS एल कैप्टन और नए (या अपने netstat का समर्थन नहीं करता है, तो -p), उपयोगlsof

    sudo lsof -i tcp:3000 
    
  3. के लिए Centos 7 उपयोग

    netstat -vanp --tcp | grep 3000
    

22
धन्यवाद! आपके उत्तर ने मेरी "डेथ_टो 'पोर्ट' स्क्रिप्ट को जन्म दिया। (# (/ usr / bin / माणिक lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1

190
"Terse" झंडे को lsof ने बाद में मारने के लिए उपयुक्त उत्पादन का उत्पादन किया:lsof -t -i tcp:1234 | xargs kill
मानव

5
मैंने इसे अपने में डाल दिया है ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillइसलिए अब मुझे बस टाइप करना है killport 8080और यह मुझे कुछ सेकंड बचाता है
अल्फांसो पेरेज़

3
एक और टिप: sudoयदि आप कोई आउटपुट नहीं देखते हैं तो lsof से पहले प्रयास करना सुनिश्चित करें
Abe Petrillo

4
एक और टिप कमांड में जोड़ने के -Pलिए है lsofताकि आउटपुट में कच्चा पोर्ट दिखाई दे:lsof -P -i:3000
जेसन एक्सेलसन

1873

खोजें:

sudo lsof -i :3000

मार:

kill -9 <PID>

61
कभी-कभी lsof -i: पोर्ट कुछ नहीं दिखाएगा। sudo lsof -i: port की कोशिश करें
किलकिला

31
सुरक्षा के लिए kill -15 <PID>सहारा लेने से पहले कोशिश करने की सलाह दें -9
जामुन होल्मग्रेन

7
@Jamon Holmgren क्यों? दोनों क्या करते हैं? और kill <PID>पर्याप्त / खतरनाक / अपूर्ण क्यों नहीं है?
माइकल ट्रू

13
@MichaelTrouw लगभग एक साल बाद, लेकिन यहाँ आपका जवाब है। :-) unix.stackexchange.com/a/8918 TL; डॉ kill -15। प्रक्रिया को खुद के बाद सफाई का मौका देती है।
जामोन होल्मग्रेन

9
मुझे लगता है कि इस उत्तर को कहना चाहिए कि क्या -9करता है।
जोसेफ फ्रेली

206

ऊपर कुछ भी मेरे लिए काम नहीं किया। मेरे अनुभव के साथ कोई भी व्यक्ति निम्नलिखित कोशिश कर सकता है (मेरे लिए काम किया):

Daud:

lsof -i :3000 (where 3000 is your current port in use)

फिर PID की रिपोर्ट की स्थिति देखें:

ps ax | grep <PID>

अंत में, "इसके साथ भिखारी":

kill -QUIT <PID>

18
यह वास्तव में फ़िलिप स्पिरिडोनोव द्वारा बहुत बाद में दिए गए जवाब से बेहतर लगता है, जिसमें आपके 9. 9 के खिलाफ 277 अपवोट्स हैं। आपकी उम्र 6 महीने पहले थी, और इसकी जानकारी थोड़ी अधिक है। कोई न्याय नहीं है ...
फ्लोरिस

पहले kill -TERM(या बस kill) कोशिश करो kill -QUIT। हर प्रक्रिया SIGQUIT पर एक क्रमिक बंद करने जा रही है।
क्रेग ६५५३५

159

पोर्ट 3000 का उपयोग करके प्रक्रिया के पीआईडी ​​को निकालने और इसे मारने के लिए एक-लाइनर।

lsof -ti:3000 | xargs kill

-T झंडा सब कुछ हटा देता है लेकिन lsof आउटपुट से PID, इसे मारना आसान बनाता है।


13
आप "सुन" बंदरगाहों को फ़िल्टर कर सकते हैं:lsof -ti:3000 -sTCP:LISTEN
ज़लेमिनि

1
यह तरीका मेरे लिए सबसे अच्छा काम करता है। साधारण एक लाइनर जो व्यस्त बंदरगाह को साफ करता है। धन्यवाद!
रयान ट्रेनर

137

सबसे आसान समाधान :

एकल बंदरगाह के लिए:

kill $(lsof -ti:3000)  #3000 is the port to be freed

सिंगल लाइन कमांड के साथ कई पोर्ट्स को मारें:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti: 3000

82500 (प्रोसेस आईडी / पीआईडी)

lsof -ti: 3001

82,499

lsof -ti: 3001,3000

82499 82500

मार $ (lsof -ti: 3001,3000)

एक ही कमांड में 82499 और 82500 दोनों प्रक्रियाओं को समाप्त करता है।

package.jsonस्क्रिप्ट में इसका उपयोग करने के लिए :

"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }


2
इसने मेरे लिए काम किया धन्यवाद :)
दिलीप थॉमस

2
खुशी है कि यह मदद की।
अभिजीत शशिकुमार

113

यह एकल कमांड लाइन याद रखना आसान है:

npx kill-port 3000

खोज के साथ अधिक शक्तिशाली उपकरण के लिए:

npx fkill-cli


पुनश्च: वे तीसरे पक्ष के जावास्क्रिप्ट पैकेज का उपयोग करते हैं। npxNode.js. के साथ बनाया गया

सूत्र: ट्वीट | GitHub


आप का उपयोग कर npx स्थापित करने पर विवरण साझा कर सकते हैं? मैंने इसे अपने मैक हाई सिएरा, 10.13.3 पर स्थापित करने की कोशिश की और यह काम नहीं करेगा।
realPK

@realPK जिसके npxसाथ npmआता है node.js, वह अलग पैकेज नहीं है। बस अपने नोड.जेएस और अपने एनपीएम संस्करणों को अपग्रेड करें।
ब्रूनो लेमोस

मैं ज्यादातर जावा करता हूं, फिर भी मैंने खुद को नोड के सामने उजागर नहीं किया है। मुझे पोर्ट पर चलने वाली हत्या सेवा का एक अलग तरीका मिला। जवाब देने के लिए टी.आई.
realPK

5
पोर्ट 3000 पर चलने वाली किसी चीज को मारने के लिए NodeJS और जावास्क्रिप्ट की जरूरत है, शायद रेल ... मुझे बहुत ज्यादा ओवरहेड लगती है। अपने .bashrc या .shshrc के साथ एक साधारण रेखा को एक उपनाम के साथ जोड़ना इंटरनेट की आवश्यकता के बिना इसे हल करेगा। अलिआस किल 3000 = 'lsof -ti: 3000 | xargs मार 'तो आप कर सकते हैं: किल 3000
खलील घरौई

इस समस्या का सबसे अच्छा समाधान .. धन्यवाद
राजा रेहान

107

आप उपयोग कर सकते हैं lsof -i:3000

वह है "लिस्ट ओपन फाइल्स"। यह आपको प्रक्रियाओं की सूची देता है और वे कौन सी फाइलें और पोर्ट का उपयोग करते हैं।


मैं 10.5 लेपर्ड (अपडेटेड क्यू) पर हूं। मुझे नहीं पता कि क्या यहाँ मायने रखता है, लेकिन lsof बंदरगाहों को प्रदर्शित नहीं करता है। lsof -h (lsof 4.78) बहुत अधिक गूढ़ है ...
oma

1
हम्म। तेंदुए पर यकीन के लिए पता नहीं है, लेकिन कोशिश करो ( जड़ के रूप में - यह महत्वपूर्ण है, मुझे लगता है) lsof -i:3000
मैट गिब्सन

59

अपने में .bash_profile, terminate3000 प्रक्रिया के लिए एक शॉर्टकट बनाएँ :

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

फिर, कॉल करें $terminateयदि यह अवरुद्ध है।


12
: आप किसी भी बंदरगाह के लिए यह लचीला पर्याप्त बना सकते हैं github.com/kevinSuttle/dotfiles/commit/...
केविन Suttle

और ऐसा वर्णनात्मक नाम = पी
माइकल पीटरसन

मेरे पास ऐसा ही कुछ है, लेकिन मैं बंदरगाह में गुजरता हूं। मैंने अपने फंक्शन केपी को किल पोर्ट का नाम दिया।
जोसेफ चैम्बर्स

58

इस तरह की प्रक्रिया को बलपूर्वक मारने के लिए, निम्न कमांड का उपयोग करें

lsof -n -i4TCP:3000 

जहां 3000 पोर्ट संख्या है वह प्रक्रिया चल रही है

यह प्रक्रिया आईडी (PID) लौटाता है और चलता है

kill -9 "PID"

पीआईडी ​​को उस नंबर से बदलें जो आपको पहले कमांड चलाने के बाद मिलता है

उदाहरण के लिए, यदि मैं पोर्ट 8080 पर चल रही प्रक्रिया को मारना चाहता हूं


38
lsof -P | grep ':3000' | awk '{print $2}'

यह आपको केवल पीओएस देगा, जिसे मैकओएस पर परीक्षण किया गया है।


10
मैक पर सभी पोर्ट 3000 पर pids को मारें: lsof -P | grep ': 3000' | awk '{प्रिंट $ 2}' | xargs मार -9
माइक क्लैग

1
क्या एक से अधिक प्रक्रिया एक ही पोर्ट को सुन सकती है?
क्रिश

हमारे रेल ऐप उन श्रमिकों की नियुक्ति करते हैं जो बाल प्रक्रियाएं हैं, और मुझे अनाथ श्रमिकों को मारने के लिए इसका उपयोग करना है
माइक क्लैग


5
यहाँ एक काम कर रहा है:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
बॉब

29

OS-X El Captain पर कमांड लाइन में निष्पादित करें:

kill -kill `lsof -t -i tcp:3000`

Lsof का ट्रिक ऑप्शन सिर्फ PID लौटाता है।


28

पोर्ट पर एक प्रक्रिया को मारने के तरीकों में से एक अजगर लाइब्रेरी का उपयोग करना है: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 )। एक बार स्थापित, बस:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

7
यह अब तक का सबसे सरल तरीका नहीं है। उत्कीर्ण उत्तरों को आपको कुछ भी डाउनलोड और इंस्टॉल करने की आवश्यकता नहीं है।
ग्रेग पस्सकारिएलो

4
जब आवश्यक शर्तें पूरी हो जाती हैं तो यह याद रखना बहुत सरल और आसान होता है। हमारे पास "सरलतम" की एक अलग परिभाषा है और यह उत्तर पूरी तरह से वैध और उचित है। शायद यह पाइप के साथ फ्रीपोर्ट स्थापित करने के निर्देशों को याद कर रहा है।
सिरिल डचोन-डोरिस

हुड के तहत, फ्रीपोर्ट सिर्फ एक आवरण है जो कॉल करता है lsof -t -i:3000.. अनावश्यक लगता है।
कोरी गोल्डबर्ग

यह समाधान सबसे आसान नहीं है, लेकिन यह ओपी द्वारा पूछे गए सवाल के साथ 100% का अनुपालन करता है ... इसलिए यह विलेख वैध AF में है
danielrvt

26

पोर्ट को अवरुद्ध करने वाली प्रक्रियाओं को देखने के लिए:

netstat -vanp tcp | grep 3000

पोर्ट को अवरुद्ध करने वाली प्रक्रियाओं को मारने के लिए:

kill $(lsof -t -i :3000)


यह मैक मशीन पर काम नहीं kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]करेगा, निम्न रिटर्न देता है: यह, हालांकि, सबसे लिनक्स डिस्ट्रोस में काम करेगा
मिलान वेलेबिट

1
@MilanVelebit वास्तव में यह मेरे मैक मशीन (सिएरा) में पूरी तरह से काम करता है। यह ठीक काम करता है अगर आपके बंदरगाह 3000पर कब्जा है। हालाँकि यदि कोई प्रक्रिया पोर्ट को ब्लॉक नहीं कर रही है, तो आपको kill: not enough argumentsत्रुटि मिलेगी ।
हेनरी

यह सिर्फ अजीब है, मैंने दो मैक (दोनों उच्च सिएरा थो), मुझे उन दोनों (पुरानी आदतों) पर उन कमांडों को चलाने की याद है और मुझे पता है कि वे नहीं चलते हैं। मैंने अभी-अभी अपनी मशीन पर फिर से कोशिश की है, यह जानते हुए कि पोर्ट पर कब्जा है, उसी त्रुटि। : /
मिलन वेलेबिट

क्या netstat -vanp tcp | grep 3000आपके पास उस पोर्ट के लिए एक वैध PID है , जो आपके कब्जे में है?
हेनरी

1
मैंने इसे bashऔर zshशेल दोनों में आज़माया । मेरे लिए ठीक काम करता है। निश्चित नहीं है कि यह आपके लिए काम क्यों नहीं कर रहा है। हाई सिएरा के साथ कुछ बात हो सकती है? मुझे कोई पता नहीं है: /
हेनरी

24

खुला कनेक्शन खोजें

lsof -i -P | grep -i "सुनो"

प्रक्रिया आईडी द्वारा मार डालो

किल -9 'पीआईडी'


20

ढूँढें और मारें:

यह सिंगल कमांड लाइन आसान है और सही तरीके से काम करती है।

kill -9 $(lsof -ti tcp:3000)

14

इसे प्राप्त करने के संभावित तरीके:

ऊपर

शीर्ष कमांड आपके सिस्टम के संसाधन उपयोग को देखने और सबसे सिस्टम संसाधनों को लेने वाली प्रक्रियाओं को देखने का पारंपरिक तरीका है। शीर्ष प्रक्रियाओं की एक सूची प्रदर्शित करता है, शीर्ष पर सबसे अधिक सीपीयू का उपयोग करने वाले लोगों के साथ।

ps

पीएस कमांड रनिंग प्रोसेस को सूचीबद्ध करता है। निम्न आदेश आपके सिस्टम पर चलने वाली सभी प्रक्रियाओं को सूचीबद्ध करता है:

ps -A

आप किसी अन्य आदेश का उपयोग किए बिना किसी विशिष्ट प्रक्रिया की खोज करने के लिए grep के माध्यम से आउटपुट को भी पाइप कर सकते हैं। निम्न आदेश फ़ायरफ़ॉक्स प्रक्रिया के लिए खोज करेंगे:

ps -A | grep firefox

किसी प्रोग्राम में सिग्नल पास करने का सबसे आम तरीका किल कमांड के साथ है।

kill PID_of_target_process

lsof

सभी खुली फ़ाइलों और उन्हें खोलने वाली प्रक्रियाओं की सूची।

lsof -i -P | grep -i "listen"
kill -9 PID

या

 lsof -i tcp:3000 

10

lsof -i tcp:port_number - उस पोर्ट पर चलने वाली प्रक्रिया को सूचीबद्ध करेगा

kill -9 PID - प्रक्रिया को मार देगा

आपके मामले में, यह होगा

lsof -i tcp:3000 आपके टर्मिनल से प्रक्रिया की पीआईडी ​​मिलती है

kill -9 PID



5

इसमें जोड़ें ~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

तब source ~/.bash_profileऔर चला

killTcpListen 8080



4

टी एल; डॉ:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

यदि आप ऐसी स्थिति में हैं जहाँ पोर्ट का उपयोग करने वाले क्लाइंट और सर्वर दोनों हैं, जैसे:

$ lsof -i tcp:3000
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)

तब आप शायद दोनों को मारना नहीं चाहते।

इस स्थिति में आप -sTCP:LISTENकेवल सुनने वाली प्रक्रियाओं की झड़ी दिखाने के लिए उपयोग कर सकते हैं। इस प्रक्रिया के साथ संयोजन -tआप स्वचालित रूप से इस प्रक्रिया को मार सकते हैं:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

4

मैंने इसके लिए एक छोटा सा फंक्शन बनाया, इसे अपनी आरसी फाइल में जोड़ें ( या .bashrc, .zshrcजो भी हो)

function kill-by-port {
  if [ "$1" != "" ]
  then
    kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
  else
    echo "Missing argument! Usage: kill-by-port $PORT"
  fi
}

तब आप बस kill-by-port 3000अपने रेल सर्वर को मारने के लिए टाइप कर सकते हैं (जो भी पोर्ट पर चल रहा है उसके लिए 3000 का प्रतिस्थापन)

इसे विफल करते हुए, आप हमेशा kill -9 $(cat tmp/pids/server.pid)रूट रूट निर्देशिका से टाइप कर सकते हैं


मुझे \$PORTसंदेश को सही ढंग से प्रदर्शित करने के लिए बैकस्लैश करना पड़ा । अन्यथा, महान काम करता है!
ashwood

4

बहु बंदरगाहों को मारने के लिए।

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

उममीद है कि इससे मदद मिलेगी!


1

आपको यह कोशिश करनी चाहिए, यह तकनीक ओएस स्वतंत्र है।

आपके आवेदन के सामने एक फ़ोल्डर है जिसे tmp कहा जाता है, उसके अंदर एक और फ़ोल्डर होता है जिसे pids कहा जाता है। उस फ़ाइल में सर्वर pid फ़ाइल है। बस उस फ़ाइल को हटा दें। पोर्ट स्वचालित रूप से खुद को मारते हैं।

मुझे लगता है कि यह आसान तरीका है।


1

यहां नाम या पोर्ट द्वारा कई प्रक्रियाओं को मारने के लिए एक सहायक बैश फ़ंक्शन है

fkill() {
  for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
  else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
  xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

उपयोग:

$ fkill [process name] [process port]

उदाहरण:

$ fkill someapp :8080 node :3333 :9000


0

यदि आप एक कोड मुक्त तरीका चाहते हैं - खुले गतिविधि प्रबंधक और नोड को मारने के लिए मजबूर करें :)



-1

चरण 1: जो सर्वर चल रहे हैं उन्हें खोजें: ps aux | grep puma चरण 2: उन सर्वर को मारें किल -9 [सर्वर नंबर]


-1

मैक ओएस में

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')


1
इसे 5 साल पहले एक टिप्पणी के रूप में पोस्ट किया गया था, और कई बार सिमुलर उत्तर पोस्ट किए गए थे।
गाइल्स गौइलार्डेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.