Bạn đang hỏi sai câu hỏi ở đây. Thật sự không thể chỉ đơn giản là "đóng một cổng" từ bên ngoài ứng dụng đã mở ổ cắm nghe trên nó. Cách duy nhất để làm điều này là tiêu diệt hoàn toàn quy trình sở hữu cổng. Sau đó, trong khoảng một hoặc hai phút, cổng sẽ có sẵn để sử dụng lại. Đây là những gì đang diễn ra (nếu bạn không quan tâm, bỏ qua đến cuối nơi tôi chỉ cho bạn cách giết quá trình sở hữu một cổng cụ thể):
Các cổng là tài nguyên được HĐH phân bổ cho các quy trình khác nhau. Điều này tương tự với việc yêu cầu HĐH cho một con trỏ tệp. Tuy nhiên, không giống như con trỏ tệp, chỉ MỘT quá trình tại một thời điểm có thể sở hữu một cổng. Thông qua giao diện ổ cắm BSD, các quy trình có thể đưa ra yêu cầu lắng nghe trên một cổng, sau đó HĐH sẽ cấp. HĐH cũng sẽ đảm bảo không có quá trình nào khác có cùng cổng. Tại bất kỳ thời điểm nào, quá trình có thể giải phóng cổng bằng cách đóng ổ cắm. Hệ điều hành sau đó sẽ lấy lại cổng. Ngoài ra, nếu quá trình kết thúc mà không giải phóng cổng, HĐH cuối cùng sẽ lấy lại cổng (mặc dù điều đó sẽ không xảy ra ngay lập tức: sẽ mất vài phút).
Bây giờ, những gì bạn muốn làm (chỉ cần đóng cổng từ dòng lệnh), không thể vì hai lý do. Đầu tiên, nếu có thể, điều đó có nghĩa là một quy trình đơn giản có thể lấy cắp tài nguyên của quy trình khác (cổng). Đây sẽ là chính sách tồi, trừ khi bị hạn chế trong các quy trình đặc quyền. Lý do thứ hai là không rõ điều gì sẽ xảy ra với quy trình sở hữu cổng nếu chúng ta để nó tiếp tục chạy. Mã của quy trình được viết giả định rằng nó sở hữu tài nguyên này. Nếu chúng ta chỉ đơn giản là lấy nó đi, nó sẽ tự sụp đổ, vì vậy OS sẽ không cho phép bạn làm điều này, ngay cả khi bạn là một quy trình đặc quyền. Thay vào đó, bạn chỉ cần giết chúng.
Dù sao, đây là cách để giết một quá trình sở hữu một cổng cụ thể:
sudo netstat -ap | grep :<port_number>
Điều đó sẽ xuất ra dòng tương ứng với cổng giữ quá trình, ví dụ:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
Trong trường hợp này, ProcHoldingPort là tên của quá trình mở cổng, 4683 là pid của nó và 8000 (lưu ý rằng đó là TCP) là số cổng mà nó giữ.
Sau đó, nhìn vào cột cuối cùng, bạn sẽ thấy /. Sau đó thực hiện điều này:
kill <pid>
Nếu điều đó không hoạt động (bạn có thể kiểm tra bằng cách chạy lại lệnh netstat). Làm cái này:
kill -9 <pid>
Nói chung, tốt hơn hết là tránh gửi SIGKILL nếu bạn có thể. Đây là lý do tại sao tôi nói với bạn để thử kill
trước kill -9
. Chỉ cần sử dụng kill
sẽ gửi SIGTERM nhẹ nhàng hơn.
Như tôi đã nói, sẽ vẫn mất vài phút để cổng mở lại nếu bạn làm điều này. Tôi không biết một cách để tăng tốc độ này. Nếu ai đó làm như vậy, tôi rất thích nghe nó.