Máy chủ Rails cho biết cổng đã được sử dụng, làm thế nào để giết quá trình đó?


275

Tôi đang trên máy Mac, đang làm:

rails server

Tôi có:

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

Tôi biết tôi có thể bắt đầu một trên một cổng mới, nhưng tôi muốn giết quá trình này.

Câu trả lời:


694

Giả sử bạn đang tìm cách tiêu diệt bất cứ thứ gì trên cổng 3000 (đó là những gì webrick thường sử dụng), hãy nhập cái này vào thiết bị đầu cuối của bạn để tìm ra PID của quy trình:

$ lsof -wni tcp:3000

Sau đó, sử dụng số trong cột PID để giết tiến trình:

$ kill -9 PID

4
bạn có thể vui lòng giải thích -wni
user993563

53
Chỉ cần làm rõ cho người mới: trong dòng mã thứ hai, bạn phải thay thế PIDbằng số thực được hiển thị trong bảng điều khiển của bạn khi nhập dòng mã đầu tiên (ví dụ 12345:).
CodeBiker

5
Bạn cũng có thể tìm thấy PID bằng cách điều hướng qua thư mục rails của bạn đến tệp sau tmp / pids / server.pid
tandy

Điều này có thể xảy ra nếu bạn đang chạy trình gỡ lỗi trong RubyMine và nó gặp sự cố hoặc một cái gì đó ... Máy chủ dừng nhưng trình gỡ lỗi vẫn tiếp tục ... Dù sao, đây là giải pháp tôi đã sử dụng và nó hoạt động hoàn hảo :)
J Smith

@tandy đây là một cách tốt để có được PID cho một dự án cụ thể, tuy nhiên, đôi khi khi một quá trình đột ngột đóng lại, tệp có thể vắng mặt nhưng máy chủ vẫn có thể chạy. Làm một lsof -wni tcp:3000sẽ luôn luôn hiển thị tất cả các quá trình lắng nghe trên giao thức đó: kết hợp cổng. (trong đó 3000 sẽ được thay thế bằng cổng máy chủ cục bộ của bạn. Ví dụ: trong Rails, đây là 3000 theo mặc định).
SidOfc

125

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


3
mọi thứ giữa các dấu ngoặc đơn sẽ trả về một id tiến trình sử dụng cổng 3000. Và -tcó nghĩa 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).là tôi đoán bạn sẽ biết những gì killsẽ làm
Papouche Guinslyzinho

Đây phải là câu trả lời được chấp nhận vì đây là một dòng 'tất cả trong một'. Đặt điều này trong một bí danh và bạn tốt để đi.
Nubtacular

Nếu một lời giải thích được đưa vào, điều này chắc chắn sẽ có giá trị upvote.
mwfearnley

2
Điều này sẽ giết tất cả các quy trình bao gồm tất cả các phiên trình duyệt đã mở. Vì vậy, bạn muốn cẩn thận khi bạn thử nó.
theterminalguy

1
Xin vui lòng xem nhận xét của tôi về câu trả lời được chấp nhận về việc sử dụng bằng kill -9cách học vẹt / theo thói quen.
lindes

29

Bạn cần lấy id tiến trình của chương trình bằng cổng tcp 3000. Để lấy id tiến trình

lsof -i tcp:3000 -t

Và sau đó sử dụng id quá trình đó, chỉ cần giết tiến trình bằng lệnh kill ubfox.

kill -9 pid

Hoặc chỉ chạy bên dưới lệnh kết hợp được đề cập. Đầu tiên nó sẽ lấy pid và sau đó giết quá trình đó.

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

Xin vui lòng xem nhận xét của tôi về câu trả lời được chấp nhận về việc sử dụng bằng kill -9cách học vẹt / theo thói quen.
lindes

17

Đối với bất kỳ ai vấp phải câu hỏi này không có trên máy Mac: giả sử bạn biết rằng máy chủ của bạn đang chạy trên cổng 3000, bạn có thể thực hiện việc này trong một lần bằng cách thực hiện như sau:

fuser -k 3000/tcp

Nhưng như Toby đã đề cập, việc triển khai bộ nhiệt áp trong Mac OS khá thô sơ và lệnh này sẽ không hoạt động trên mac.


1
Điều này sẽ không hoạt động trên mac (Mac đã được quy định trong câu hỏi) vì fuser chỉ chấp nhận c, f và u là các tùy chọn.
Toby

Tôi đã cập nhật câu trả lời và nó cũng giải quyết cách sử dụng nó cho người dùng mac. Không có lý do để bỏ phiếu đặc biệt là xem xét những người khác, bao gồm cả bản thân tôi vấp phải câu hỏi này trong quá khứ mặc dù không phải là trên một máy mac.
saneshark

Thêm một -vcờ cũng cho thấy một lượng nhỏ thông tin về quá trình đã bị giết. Vì vậy fuser -kv 3000/tcp. Than ôi, bộ nhiệt áp của MacOS không có khả năng này. kill $(lsof -ti tcp:3000)là một tương đương khá gần, mặc dù.
lindes

14

Đôi khi có một cơ hội mà máy chủ rails không đóng đúng cách. Bạn có thể tìm thấy quá trình được sử dụng bởi đường ray

ps phụ | đường ray grep

Đầu ra sẽ như thế nào

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

Ở đây process_id 12609 được sử dụng bởi máy chủ rails của bạn.

Bạn có thể giết nó dễ dàng bằng lệnh

giết -9 12609


Điều này đã trở thành "ps aux | grep ruby" đối với tôi. Có thể từ việc chuyển đổi từ webrick sang puma
Rigyt

Xin vui lòng xem nhận xét của tôi về câu trả lời được chấp nhận về việc sử dụng bằng kill -9cách học vẹt / theo thói quen.
buộc

Tôi đã phải làm điều này để tìm đúng quy trìnhps aux | grep puma
Sami Birnbaum

11

Tất cả các câu trả lời ở trên thực sự tốt nhưng tôi cần một cách để nhập càng ít càng tốt trong thiết bị đầu cuối để tôi tạo ra một viên ngọc cho nó. Bạn chỉ có thể cài đặt đá quý một lần và chạy lệnh 'shutup' mỗi khi bạn muốn giết tiến trình Rails (trong khi đang ở trong thư mục hiện tại).

gem install shutup

sau đó vào thư mục hiện tại của dự án đường ray của bạn và chạy

shutup # điều này sẽ giết quá trình Rails hiện đang chạy

Bạn có thể sử dụng lệnh 'shutup' mỗi khi bạn muốn

DICLAIMER: Tôi là người tạo ra viên ngọc này

LƯU Ý: nếu bạn đang sử dụng rvm, hãy cài đặt gem trên toàn cầu

rvm @global do gem install shutup

cái này gọn gàng Nhìn vào nguồn, đá quý của bạn tìm tệp pid, nhưng điều đó không được đảm bảo tồn tại. các lsofcách tiếp cận là đáng tin cậy hơn.
tối đa pleaner

@maxpleaner: đúng, và cũng có nhiều khả năng giết một số quy trình khác có thể đang lắng nghe trên cổng đó, trong trường hợp đã được thực hiện (có thể do tai nạn).
lindes

Nó hoạt động ở đây. Nếu bạn đang đọc nó vào năm 2019, vui lòng cài đặt viên ngọc này, nó thực sự hoạt động, dễ dàng hơn nhiều .. chỉ cần chạy cài đặt đá quý trong thư mục của bạn, và mỗi khi bạn cần giết chỉ cần gõ "shutup"
Guilherme Nunes

Tôi đã cài đặt viên ngọc này, và chạy nó và nó đã giết Sinatra. Tuy nhiên, từ giờ cổng mặc định 4567 không phản hồi, cũng không có cổng nào khác được đặt bởi lệnh 'set: port XXXX'. Làm thế nào tôi có thể xử lý này?
NevD

2

ps aux | grep rails sử dụng lệnh này, bạn có thể giết máy chủ


1

Theo mặc định, máy chủ rails sử dụng cổng 3000.
Vì vậy, bạn có 2 tùy chọn để chạy máy chủ rails.
1. Hoặc bạn có thể chạy máy chủ trên cổng khác bằng cách xác định cổng tùy chỉnh bằng lệnh sau
rails s -p 3001
2. Hoặc bạn có thể tắt tất cả quy trình ruby ​​đang chạy bằng cách chạy lệnh
killall -9 ruby
sau rồi chạyrails server


0

Giải pháp một dòng:

kill -9 $(ps aux | grep 'rails s' | awk {'print$2'}); rails s

-4

Gõ vào:

man lsof

Sau đó tìm -w, -n và -i

-i: công cụ internet -n: làm cho nó nhanh hơn -w: bật tắt cảnh báo

Có CÁCH chi tiết hơn trên các trang người đàn ông


-6

Nếu bạn đang ở trên máy tính, hãy làm theo các bước sau.

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

Ở đó bạn sẽ có một tập tin gọi là server.pid

xóa đi.

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

Đó là nó.

EDIT: Vui lòng tham khảo điều này


3
Điều này sẽ không dừng máy chủ.
Nafaa Boutefer 15/03/2015

Mặc dù mã này có thể giúp giải quyết vấn đề, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách nó trả lời câu hỏi (cụ thể, tại sao bạn nghĩ rằng một đề xuất cho máy Windows có thể hữu ích cho câu hỏi nêu trên MacOS) sẽ cải thiện đáng kể giá trị lâu dài của nó. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số lời giải thích.
Toby Speight
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.