रेल सर्वर कहता है कि पोर्ट पहले से ही इस्तेमाल किया गया है, उस प्रक्रिया को कैसे मारें?


275

मैं एक पर हूँ MAC, कर:

rails server

मुझे मिला:

2010-12-17 12:35:15] INFO  WEBrick 1.3.1
[2010-12-17 12:35:15] INFO  ruby 1.8.7 (2010-08-16) [i686-darwin10.4.0]
[2010-12-17 12:35:15] WARN  TCPServer Error: Address already in use - bind(2)
Exiting

मुझे पता है कि मैं एक नए पोर्ट पर शुरुआत कर सकता हूं, लेकिन मैं इस प्रक्रिया को मारना चाहता हूं।

जवाबों:


694

मान लें कि आप पोर्ट 3000 पर जो कुछ भी मारना चाहते हैं (जो सामान्य रूप से वेब्रिक का उपयोग करता है), इस प्रक्रिया के पीआईडी ​​का पता लगाने के लिए अपने टर्मिनल में टाइप करें:

$ lsof -wni tcp:3000

फिर, प्रक्रिया को मारने के लिए PID कॉलम में संख्या का उपयोग करें:

$ kill -9 PID

4
क्या आप कृपया समझा सकते हैं -wni
user993563

53
बस नौसिखियों के लिए स्पष्ट करने के लिए: कोड की दूसरी पंक्ति में, आपको PIDवास्तविक संख्या के साथ प्रतिस्थापित करना चाहिए जो आपके कंसोल में कोड की पहली पंक्ति (जैसे, 12345) में प्रवेश करने पर दिखाई जाती है ।
कोडबिकर

5
तुम भी निम्न फ़ाइल tmp / पीआईडी / server.pid करने के लिए अपने पटरियों निर्देशिका के माध्यम से नेविगेट करने से पीआईडी पा सकते हैं
Tandy

ऐसा तब हो सकता है जब आप RubyMine में डिबगर चला रहे हों और यह क्रैश हो जाए या कुछ और ... सर्वर बंद हो जाए, लेकिन डीबगर जारी रहे ... वैसे भी, यह मेरे द्वारा उपयोग किया गया समाधान है और यह पूरी तरह से काम करता है :)
जे स्मिथ

@ यह एक विशिष्ट परियोजना के लिए PID प्राप्त करने का एक अच्छा तरीका है, हालांकि, कभी-कभी जब कोई प्रक्रिया अचानक बंद हो जाती है, तो फ़ाइल अनुपस्थित हो सकती है लेकिन सर्वर अभी भी चल सकता है। lsof -wni tcp:3000वसीयत करना हमेशा उस प्रोटोकॉल पर सुनने वाली सभी प्रक्रियाओं को दिखाएगा : पोर्ट संयोजन। (जहां 3000 को आपके स्थानीय सर्वर पोर्ट से बदला जाना है। जैसे रेल में यह डिफ़ॉल्ट रूप से 3000 है)।
सिडऑफ

125

kill -9 $(lsof -i tcp:3000 -t)


3
कोष्ठक के बीच सब कुछ पोर्ट आईडी का उपयोग करते हुए एक प्रक्रिया आईडी लौटाएगा। और -tइसका मतलब specifies that lsof should produce terse output with process identifiers only and no header - e.g., so that the output may be piped to kill(1).है कि मुझे लगता है कि आप जानते हैं कि क्या killकरेंगे
पापो गुइलिनज़िन्हो

यह स्वीकृत उत्तर होना चाहिए क्योंकि यह एक 'ऑल इन वन' लाइन है। इसे एक उपनाम में रखें और आप जाने के लिए अच्छे हैं।
नटबटर्नल

यदि एक स्पष्टीकरण शामिल किया गया था, तो यह निश्चित रूप से एक उत्थान के लायक होगा।
mwfearnley

2
यह सभी खोले गए ब्राउज़र सत्र सहित सभी प्रक्रियाओं को मार देगा। इसलिए जब आप इसे आज़माते हैं तो आप सावधान रहना चाहते हैं।
धमनीविभाजन

1
कृपया kill -9रटे / आदतन उपयोग करने के बारे में स्वीकृत उत्तर पर मेरी टिप्पणी देखें ।
lindes

29

आपको tcp port 3000 का उपयोग करके प्रोग्राम की प्रोसेस आईडी प्राप्त करने की आवश्यकता है। प्रोसेस आईडी प्राप्त करने के लिए

lsof -i tcp:3000 -t

और फिर उस प्रक्रिया आईडी का उपयोग करके, बस ubuntu मार कमांड का उपयोग करके प्रक्रिया को मार डालो।

kill -9 pid

या बस नीचे दिए गए कम्बाइन कमांड को चलाएं। यह पहले पीड़ को लाएगा और फिर उस प्रक्रिया को मार देगा।

kill -9 $(lsof -i tcp:3000 -t)

कृपया kill -9रटे / आदतन उपयोग करने के बारे में स्वीकृत उत्तर पर मेरी टिप्पणी देखें ।
lindes

17

किसी भी व्यक्ति के लिए यह सवाल है कि यह मैक पर नहीं है: ठोकर खा रहा है, यह मानते हुए कि आपका सर्वर पोर्ट 3000 पर चल रहा है, आप निम्नलिखित को निष्पादित करके एक शॉट में कर सकते हैं:

fuser -k 3000/tcp

लेकिन जैसा कि टोबी ने उल्लेख किया है, मैक ओएस में फ्यूज़र का कार्यान्वयन बल्कि आदिम है और यह आदेश मैक पर काम नहीं करेगा।


1
यह मैक पर काम नहीं करेगा (मैक को प्रश्न में निर्धारित किया गया था) क्योंकि फ़्यूज़र केवल विकल्प के रूप में सी, एफ, और यू स्वीकार करता है।
टॉबी

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

-vझंडे को जोड़ने से जानकारी का एक छोटा सा हिस्सा भी पता चलता है कि किस प्रक्रिया को मार दिया गया। तो fuser -kv 3000/tcp। अफसोस है कि MacOS के फ्यूज़र में यह क्षमता नहीं है। kill $(lsof -ti tcp:3000)एक काफी करीब बराबर है, यद्यपि।
lindes

14

कुछ बार ऐसा मौका आता है जहां रेल सर्वर ठीक से बंद नहीं होता है। आप रेल द्वारा उपयोग की जाने वाली प्रक्रिया पा सकते हैं

ps aux | grep रेल

आउटपुट जैसा होगा

user     12609  9.8  0.5  66456 45480 pts/0    Sl+  21:06   0:02 /home/user/.rvm/rubies/ruby-2.2.0-preview1/bin/ruby bin/rails s

यहाँ process_id 12609 का उपयोग आपके रेल सर्वर द्वारा किया जाता है।

आप इसे आसानी से कमांड द्वारा मार सकते हैं

किल -9 12609


यह मेरे लिए "ps aux | grep ruby" बन गया है। शायद
वीब्रिक

कृपया kill -9रटे / आदतन उपयोग करने के बारे में स्वीकृत उत्तर पर मेरी टिप्पणी देखें ।
lindes

मुझे सही प्रक्रिया खोजने के लिए ऐसा करना पड़ाps aux | grep puma
सामी बीरनबाम

11

उपरोक्त सभी उत्तर वास्तव में अच्छे हैं लेकिन मुझे टर्मिनल में जितना संभव हो सके टाइप करने की आवश्यकता थी इसलिए मैंने उसके लिए एक रत्न बनाया। आप केवल एक बार मणि स्थापित कर सकते हैं और हर बार जब आप रेल प्रक्रिया को मारना चाहते हैं (वर्तमान फ़ोल्डर में रहते हुए) कमांड 'शटअप' चला सकते हैं।

gem install shutup

फिर अपने रेल परियोजना के वर्तमान फ़ोल्डर में जाएं और चलाएं

shutup # यह वर्तमान में चल रही रेल प्रक्रिया को मार देगा

आप हर बार 'शटअप' कमांड का उपयोग कर सकते हैं

डिक्लेमर: मैं इस रत्न का निर्माता हूं

नोट: यदि आप rvm का उपयोग कर रहे हैं तो विश्व स्तर पर मणि स्थापित करें

rvm @global do gem install shutup

यह साफ-सुथरा है। स्रोत को देखते हुए, आपका मणि पिड फ़ाइल के लिए दिखता है, लेकिन यह मौजूद होने की गारंटी नहीं है। lsofदृष्टिकोण अधिक भरोसेमंद है।
अधिकतम प्लनर

@maxpleaner: सच है, और कुछ अन्य प्रक्रिया को मारने की संभावना भी है जो उस बंदरगाह पर सुन सकते हैं, अगर ऐसा किया गया था (शायद दुर्घटना से)।
lindes

यह यहाँ काम करता है। यदि आप इसे 2019 में पढ़ रहे हैं, तो कृपया इस रत्न को स्थापित करें, यह वास्तव में बहुत आसान काम करता है .. बस अपने फ़ोल्डर में मणि स्थापित शटअप चलाएं, और हर बार आपको बस "शटअप" को मारने की आवश्यकता है
Guilherme Nunes

मैंने इस मणि को स्थापित किया, और इसे चलाया और इसने सिनात्रा को मार डाला। हालाँकि, अब से डिफ़ॉल्ट पोर्ट 4567 का जवाब नहीं है, और न ही 'सेट: पोर्ट XXXX' कमांड द्वारा किसी अन्य पोर्ट को सेट किया गया है। इससे मैं किस तरह निपट सकता हूं?
नेवीडी

2

ps aux | grep रेल इस कमांड का उपयोग कर आप सर्वर को मार सकते हैं


1

डिफ़ॉल्ट रूप से, रेल सर्वर पोर्ट 3000 का उपयोग करता है।
इसलिए, आपके पास रेल सर्वर चलाने के लिए 2 विकल्प हैं।
1. या तो आप निम्नलिखित कमांड का उपयोग करके कस्टम पोर्ट को परिभाषित करके अन्य पोर्ट पर सर्वर चला सकते हैं
rails s -p 3001
2. या फिर आप निम्न कमांड को चलाकर सभी चल रही माणिक प्रक्रिया को मार सकते
killall -9 ruby
हैंrails server



-4

में टाइप करें:

man lsof

फिर -w, -n, और -i के लिए देखें

-i: इंटरनेट सामान -n: यह तेजी से बनाता है -w: चेतावनी चेतावनी

आदमी पृष्ठों पर अधिक विवरण हैं


-6

यदि आप विंडोज़ मशीन पर हैं तो इन चरणों का पालन करें।

c:/project/
cd tmp
c:/project/tmp
cd pids
c:/project/tmp/pids
dir

वहां आपको server.pid नामक फाइल मिलेगी

इसे मिटाओ।

c:/project/tmp/pid> del *.pid

बस।

संपादित करें: कृपया इसे देखें


3
इससे सर्वर बंद नहीं होगा।
नेफा बाउटफर

हालाँकि, यह कोड समस्या को हल करने में मदद कर सकता है, क्यों और / या यह सवाल का जवाब कैसे देता है, इसके बारे में अतिरिक्त संदर्भ प्रदान करता है (विशेष रूप से, आपको लगता है कि विंडोज मशीन के लिए एक सुझाव एक सवाल के लिए उपयोगी हो सकता है जो बताता है कि यह MacOS पर है) अपने दीर्घकालिक मूल्य में महत्वपूर्ण सुधार करेगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें।
टोबी स्पाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.