Làm cách nào để đóng một cổng mở từ thiết bị đầu cuối trên máy Mac?


197

Tôi đã mở cổng # 5955 từ một lớp java để kết hợp từ máy khách. Làm thế nào để tôi đóng cổng này sau khi tôi hoàn thành? và lệnh nào có thể chỉ cho tôi nếu cổng mở hoặc đóng?


1
Làm thế nào bạn mở cổng đó? Không rõ liệu bạn đang nói về việc mở và đóng các cổng trong ứng dụng java hoặc từ tường lửa.
marioangiorgio

Câu trả lời:


394
  1. Tìm ra ID tiến trình (PID) đang chiếm số cổng (ví dụ: 5955) mà bạn muốn giải phóng

    sudo lsof -i :5955
    
  2. Giết quá trình hiện đang sử dụng cổng bằng cách sử dụng PID của nó

    sudo kill -9 PID
    

32
Gửi -9 không nên là nỗ lực đầu tiên để giết quá trình và đó là một thói quen rất xấu. Như tôi nhớ lại, trước tiên bạn chỉ nên sử dụng kill PID(ngụ ý -15), sau đó thử -2 và -1. -9 là giải pháp cuối cùng chỉ khi mọi lựa chọn khác không hoạt động.
Meow

3
đã giết pID mà không có bất kỳ cờ nào theo đề xuất của @Meow và điều này hiệu quả với tôi
Toni Leigh

39

Để tìm quá trình thử:

sudo lsof -i :portNumber

Giết quá trình hiện đang sử dụng cổng bằng cách sử dụng PID của nó

kill PID

và sau đó kiểm tra xem cổng đã đóng chưa. Nếu không, hãy thử:

kill -9 PID

Tôi sẽ chỉ làm như sau nếu trước đó không hoạt động

sudo kill -9 PID

Chỉ để được an toàn. Một lần nữa tùy thuộc vào cách bạn mở cổng, điều này có thể không quan trọng.


25

Tuy nhiên, bạn đã mở cổng, bạn đóng nó theo cùng một cách. Ví dụ: nếu bạn đã tạo một ổ cắm, hãy gắn nó vào cổng 0.0.0.0:5955 và gọi là lắng nghe, đóng cùng một ổ cắm đó.

Bạn cũng có thể giết quá trình mở cổng.

Nếu bạn muốn tìm hiểu quy trình nào có cổng mở, hãy thử điều này:

lsof -i :5955

Nếu bạn muốn biết liệu một cổng có mở hay không, bạn có thể thực hiện cùng một lệnh lsof (nếu bất kỳ quá trình nào mở, nó sẽ mở; nếu không, thì không), hoặc bạn chỉ có thể thử kết nối với nó, ví dụ:

nc localhost 5955

Nếu nó trả về ngay lập tức mà không có đầu ra, cổng sẽ không mở.

Có thể đáng nói rằng, về mặt kỹ thuật, đó không phải là một cổng mở, mà là một kết hợp máy chủ: cổng. Ví dụ: nếu bạn cắm vào mạng LAN là 10.0.1.2, bạn có thể liên kết ổ cắm với 127.0.0.1:5955 hoặc 10.0.1.2:5955 mà không ảnh hưởng đến mạng kia hoặc bạn có thể liên kết với 0.0.0.0 : 5955 để xử lý cả hai cùng một lúc. Bạn có thể xem tất cả các địa chỉ IPv4 và IPv6 của máy tính bằng ifconfiglệnh.


24

cổng 5900 rất đơn giản:

sudo lsof -i :5900

sau đó coi 59553 là PID

sudo kill 59553

1
Điều này không thêm bất cứ điều gì vào câu trả lời hiện có!
ghét

16

Năm 2018 đây là những gì làm việc cho tôi bằng MacOS HighSierra:

sudo lsof -nPi: yourPortNumber

sau đó:

sudo kill -9 yourPIDnumber


1
lsof -nPitốt hơn một chút vì số cổng thực sự hiển thị trong đầu ra và bạn sẽ có cảm giác tốt hơn về những gì bạn đang giết.
Đá phong phú

1
Cũng hữu ích khi xem thông tin của tất cả các cổng nghe:sudo lsof -nPi | grep LISTEN
leanne

14

Một lớp lót là tốt nhất

kill -9 $(lsof -i:PORT -t) 2> /dev/null

Ví dụ: Trên mac, muốn xóa cổng 9604. Lệnh sau hoạt động như một bùa mê

 kill -9 $(lsof -i:9604 -t) 2> /dev/null 

6

Bạn cũng có thể sử dụng lệnh đầu tiên này để giết tiến trình sở hữu một cổng cụ thể:

sudo netstat -ap | grep :<port_number>

Ví dụ: giả sử quy trình này giữ cổng 8000 TCP, sau đó chạy lệnh:

sudo netstat -ap | grep :8000

sẽ xuất ra dòng tương ứng với quá trình giữ cổng 8000 , 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ữ (mà bạn muốn đóng).

Sau đó, giết quá trình, theo ví dụ trên:

kill  4683

Như những người khác đã đề cập ở đây, nếu điều đó không hiệu quả (bạn có thể thử sử dụng kill với -9 làm đối số):

kill -9 4683

Một lần nữa, nói chung, tốt hơn hết là tránh gửi SIGKILL (-9) nếu bạn có thể.

Chúc mừng

Chàng.


5

Tôi sử dụng lsofkết hợp với kill, như đã đề cập ở trên; nhưng đã viết một tập lệnh bash nhỏ nhanh chóng để tự động hóa quá trình này.

Với tập lệnh này, bạn có thể chỉ cần gõ killport 3000từ bất cứ đâu và nó sẽ giết tất cả các tiến trình đang chạy trên cổng 3000.

https://github.com/xtrasimplicity/killport


1
Bạn đã cứu ngày của tôi. Vì một số lý do lsofkết hợp với killviệc không trả lại bất cứ điều gì và khiến tập lệnh của tôi bị treo trên macOS Sierra. Nhưng killporthoạt động như một sự quyến rũ và nhanh hơn. Cảm ơn!
Wout

4

Tôi đã tạo ra một chức năng cho mục đích này.

function free_port() {
    if [ -z $1 ] 
    then
        echo no Port given
    else
        PORT=$1;
        PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port 

        if [ -z $PID ] 
        then
            echo port: $PORT is already free.
        else
            sudo kill -9 $PID # kill the process, which frees the port
            echo port: $PORT is now free.
        fi
    fi
}

free_port 80 # you need to change this port number

Sao chép và dán khối mã này trong thiết bị đầu cuối của bạn sẽ giải phóng cổng mong muốn của bạn. Chỉ cần nhớ thay đổi số cổng ở dòng cuối cùng.


3

thử bên dưới, giả sử cổng đang chạy là 8000:

free-port() { kill "$(lsof -t -i :8000)"; }

Tôi tìm thấy tài liệu tham khảo ở đây


1

Khi chương trình mở cổng thoát, cổng sẽ tự động bị đóng. Nếu bạn giết tiến trình Java chạy máy chủ này, thì nên làm điều đó.


-1
  1. Trước tiên hãy tìm id của Procees (pid) đã chiếm cổng yêu cầu. (Ví dụ: 5434)

    ps phụ | grep 5434

2. làm cho quá trình đó

   kill -9 <pid>
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.