เซิร์ฟเวอร์ Rails แจ้งว่าพอร์ตที่ใช้ไปแล้วจะฆ่ากระบวนการนั้นได้อย่างไร


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 (ซึ่งปกติใช้ webrick) ให้พิมพ์สิ่งนี้ในเทอร์มินัลของคุณเพื่อค้นหา PID ของกระบวนการ:

$ lsof -wni tcp:3000

จากนั้นใช้หมายเลขในคอลัมน์ PID เพื่อฆ่ากระบวนการ:

$ kill -9 PID

4
คุณช่วยอธิบายได้-wni
user993563

53
เพียงชี้แจงสำหรับสามเณร: ในบรรทัดที่สองของรหัสคุณควรจะแทนที่PIDด้วยจำนวนจริงที่ปรากฏในคอนโซลของคุณเมื่อเข้าสู่บรรทัดแรกของรหัส (เช่น12345)
CodeBiker

5
นอกจากนี้คุณยังสามารถค้นหา PID ได้โดยไปที่ไดเรกทอรี Rails ของคุณไปยังไฟล์ tmp / pids / server.pid ต่อไปนี้
tandy

นี้สามารถเกิดขึ้นได้ถ้าคุณใช้ดีบักใน RubyMine และเกิดปัญหาหรือสิ่งที่ ... เซิร์ฟเวอร์หยุด แต่การดีบักเกอร์ยังคง ... อย่างไรก็ตามนี้เป็นวิธีการที่ผมใช้และการทำงานอย่างสมบูรณ์ :)
เจสมิ ธ

@tandy นี่เป็นวิธีที่ดีในการรับ PID สำหรับโครงการเฉพาะอย่างไรก็ตามบางครั้งเมื่อกระบวนการปิดโดยกะทันหันไฟล์อาจหายไป แต่เซิร์ฟเวอร์อาจยังทำงานอยู่ ทำlsof -wni tcp:3000จะเสมอแสดงทุกกระบวนการฟังบนโปรโตคอลที่: การรวมกันพอร์ต (โดยที่ 3000 จะถูกแทนที่ด้วยพอร์ตเซิร์ฟเวอร์ท้องถิ่นของคุณเช่นใน Rails ค่านี้คือ 3000 โดยค่าเริ่มต้น)
SidOfc

125

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


3
ทุกอย่างระหว่างวงเล็บจะส่งคืนรหัสกระบวนการที่ใช้พอร์ต 3000 และ-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จะต้องทำอย่างไร
Papouche Guinslyzinho

นี่ควรเป็นคำตอบที่ยอมรับเนื่องจากเป็นบรรทัด 'all in one' ใส่สิ่งนี้ในนามแฝงและคุณก็พร้อมที่จะไป
Nubtacular

หากมีคำอธิบายรวมอยู่ด้วยสิ่งนี้จะคุ้มค่ากับการโหวตขึ้นอย่างแน่นอน
mwfearnley

2
วิธีนี้จะฆ่ากระบวนการทั้งหมดรวมถึงเซสชันเบราว์เซอร์ที่เปิดอยู่ทั้งหมด ดังนั้นคุณต้องระวังเมื่อคุณลอง
theterminalguy

1
โปรดดูความคิดเห็นของฉันเกี่ยวกับคำตอบที่ยอมรับเกี่ยวกับการใช้kill -9โดยการท่องจำ / เป็นปกติ
lindes

29

คุณต้องได้รับรหัสกระบวนการของโปรแกรมโดยใช้พอร์ต TCP 3000 เพื่อรับรหัสกระบวนการ

lsof -i tcp:3000 -t

จากนั้นใช้รหัสกระบวนการเพียงแค่ฆ่ากระบวนการโดยใช้คำสั่ง ubuntu kill

kill -9 pid

หรือเพียงเรียกใช้คำสั่งรวมที่กล่าวถึงด้านล่าง มันจะดึงข้อมูล pid ก่อนแล้วจึงฆ่ากระบวนการนั้น

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

โปรดดูความคิดเห็นของฉันเกี่ยวกับคำตอบที่ยอมรับเกี่ยวกับการใช้kill -9โดยการท่องจำ / เป็นปกติ
lindes

17

สำหรับใครก็ตามที่สะดุดกับคำถามนี้ที่ไม่ได้อยู่ใน Mac: สมมติว่าคุณรู้ว่าเซิร์ฟเวอร์ของคุณกำลังทำงานอยู่ที่พอร์ต 3000 คุณสามารถทำสิ่งนี้ได้ในนัดเดียวด้วยการดำเนินการดังต่อไปนี้:

fuser -k 3000/tcp

แต่ตามที่ Toby ได้กล่าวมาการใช้ fuser ใน Mac OS นั้นค่อนข้างดั้งเดิมและคำสั่งนี้จะไม่ทำงานบน mac


1
สิ่งนี้จะไม่ทำงานบน mac (มีการระบุ Mac ไว้ในคำถาม) เนื่องจาก fuser ยอมรับเฉพาะตัวเลือก c, f และ u เท่านั้น
Toby

ฉันได้อัปเดตคำตอบแล้วและยังกล่าวถึงวิธีใช้สำหรับผู้ใช้ mac ด้วย ไม่มีเหตุผลใดที่จะต้องลงคะแนนโดยเฉพาะอย่างยิ่งเมื่อพิจารณาจากคนอื่นรวมถึงตัวฉันเองก็สะดุดกับคำถามนี้ในอดีตแม้ว่าจะไม่ได้อยู่ใน mac
saneshark

การเพิ่มการ-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 นั้นถูกใช้โดยเซิร์ฟเวอร์ของคุณ

คุณสามารถฆ่ามันได้อย่างง่ายดายโดยคำสั่ง

kill -9 12609


นี่กลายเป็น "ps aux | grep ruby" สำหรับฉัน อาจมาจากการเปลี่ยนจาก webrick เป็น puma
rigyt

โปรดดูความคิดเห็นของฉันเกี่ยวกับคำตอบที่ยอมรับเกี่ยวกับการใช้kill -9โดยการท่องจำ / เป็นปกติ
lindes

ฉันต้องทำเช่นนี้เพื่อค้นหากระบวนการที่ถูกต้องps aux | grep puma
Sami Birnbaum

11

คำตอบทั้งหมดข้างต้นนั้นดีมาก แต่ฉันต้องการวิธีพิมพ์ให้ได้มากที่สุดในเทอร์มินัลดังนั้นฉันจึงสร้างอัญมณีสำหรับสิ่งนั้น คุณสามารถติดตั้งอัญมณีเพียงครั้งเดียวและเรียกใช้คำสั่ง 'ปิดเครื่อง' ทุกครั้งที่คุณต้องการฆ่ากระบวนการ Rails (ในขณะที่อยู่ในโฟลเดอร์ปัจจุบัน)

gem install shutup

จากนั้นไปที่โฟลเดอร์ปัจจุบันของโปรเจค Rails และเรียกใช้

shutup # สิ่งนี้จะทำให้กระบวนการ Rails ทำงานในปัจจุบัน

คุณสามารถใช้คำสั่ง 'ปิดเครื่อง' ทุกครั้งที่คุณต้องการ

ผู้ปฏิเสธความรับผิดชอบ: ฉันเป็นผู้สร้างอัญมณีนี้

หมายเหตุ: หากคุณใช้ rvm ติดตั้ง gem ทั่วโลก

rvm @global do gem install shutup

นี่มันเรียบร้อย เมื่อดูที่แหล่งอัญมณีของคุณจะค้นหาไฟล์ pid แต่ไม่รับประกันว่าจะมีอยู่จริง lsofวิธีการเป็นที่พึ่งได้มากขึ้น
สูงสุด

@maxpleaner: จริงและมีแนวโน้มที่จะฆ่ากระบวนการอื่น ๆ ที่อาจฟังพอร์ตนั้นในกรณีที่ทำไปแล้ว (อาจเกิดจากอุบัติเหตุ)
lindes

มันใช้งานได้ที่นี่ หากคุณกำลังอ่านสิ่งนี้ในปี 2019 โปรดติดตั้งอัญมณีนี้มันใช้งานได้จริงมากขึ้น .. เพียงแค่รันการติดตั้ง gem ติดตั้งในโฟลเดอร์ของคุณและทุกครั้งที่คุณต้องสังหารเพียงพิมพ์ "shutup"
Guilherme Nunes

ฉันติดตั้งอัญมณีนี้และวิ่งมันและมันฆ่าซินาตร้า อย่างไรก็ตามจากนี้พอร์ตเริ่มต้น 4567 จะไม่ตอบสนองหรือพอร์ตอื่นใดที่ตั้งค่าโดยคำสั่ง 'set: port XXXX' ฉันจะจัดการสิ่งนี้ได้อย่างไร
NevD


1

โดยค่าเริ่มต้นเซิร์ฟเวอร์ rails ใช้พอร์ต 3000
ดังนั้นคุณมี 2 ตัวเลือกในการรันเซิร์ฟเวอร์ rails
1. คุณสามารถเรียกใช้เซิร์ฟเวอร์บนพอร์ตอื่นโดยการกำหนดพอร์ตแบบกำหนดเองโดยใช้คำสั่งต่อไปนี้
rails s -p 3001
2. หรือคุณสามารถฆ่ากระบวนการทับทิมที่กำลังทำงานอยู่ทั้งหมดโดยการเรียกใช้คำสั่งต่อไปนี้
killall -9 ruby
จากนั้นเรียกใช้rails server



-4

พิมพ์ใน:

man lsof

จากนั้นมองหา -w, -n และ -i

-i: สิ่งที่อินเทอร์เน็ต -n: ทำให้เร็วขึ้น -w: สลับคำเตือน

มีวิธีรายละเอียดเพิ่มเติมในหน้าคน


-6

หากคุณอยู่บนเครื่อง windows ให้ทำตามขั้นตอนเหล่านี้

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

คุณจะมีไฟล์ชื่อ server.pid

ลบมัน.

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

แค่นั้นแหละ.

แก้ไข: โปรดอ้างอิงสิ่งนี้


3
นี่จะไม่หยุดเซิร์ฟเวอร์
Nafaa Boutefer

แม้ว่ารหัสนี้อาจช่วยแก้ปัญหาได้ แต่มีบริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการตอบคำถาม (โดยเฉพาะอย่างยิ่งทำไมคุณคิดว่าคำแนะนำสำหรับเครื่อง Windows อาจมีประโยชน์สำหรับคำถามที่ระบุว่าเป็น MacOS) จะช่วยปรับปรุงมูลค่าระยะยาวอย่างมีนัยสำคัญ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบาย
Toby Speight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.