Bagaimana cara menutup port terbuka dari terminal di Mac?


197

Saya membuka port # 5955 dari kelas java untuk berkomunikasi dari klien. Bagaimana saya menutup port ini setelah saya selesai? dan juga perintah mana yang dapat menunjukkan kepada saya jika port terbuka atau tertutup?


1
Bagaimana Anda membuka porta itu? Tidak jelas apakah Anda berbicara tentang membuka dan menutup porta dalam aplikasi java atau dari firewall.
mariosangiorgio

Jawaban:


395
  1. Cari tahu ID proses (PID) yang menempati nomor port (mis., 5955) yang ingin Anda bebaskan

    sudo lsof -i :5955
    
  2. Matikan proses yang saat ini menggunakan port menggunakan PID-nya

    sudo kill -9 PID
    

32
Mengirim -9 seharusnya bukan upaya pertama untuk membunuh suatu proses, dan itu kebiasaan yang sangat buruk. Seingat saya, Anda harus terlebih dahulu hanya menggunakan kill PID(yang menyiratkan -15), kemudian coba -2 dan -1. -9 adalah pilihan terakhir hanya jika setiap opsi lain gagal berfungsi.
Meow

3
memang membunuh pID tanpa bendera seperti yang disarankan oleh @ Meow dan ini bekerja untuk saya
Toni Leigh

39

Untuk menemukan prosesnya coba:

sudo lsof -i :portNumber

Matikan proses yang saat ini menggunakan port menggunakan PID-nya

kill PID

dan kemudian periksa untuk melihat apakah port ditutup. Jika tidak, coba:

kill -9 PID

Saya hanya akan melakukan yang berikut jika sebelumnya tidak berhasil

sudo kill -9 PID

Untuk amannya. Sekali lagi tergantung pada bagaimana Anda membuka porta, ini mungkin tidak masalah.


25

Bagaimanapun Anda membuka port, Anda menutupnya dengan cara yang sama. Misalnya, jika Anda membuat soket, ikatkan ke port 0.0.0.0.095955, dan panggil dengarkan, tutup soket yang sama.

Anda juga dapat mematikan proses yang membuka porta.

Jika Anda ingin mengetahui proses apa yang memiliki port terbuka, coba ini:

lsof -i :5955

Jika Anda ingin tahu apakah suatu port terbuka, Anda dapat melakukan perintah lsof yang sama (jika ada proses yang terbuka, itu terbuka; jika tidak, itu tidak), atau Anda dapat mencoba menyambungkannya, misalnya:

nc localhost 5955

Jika segera kembali tanpa output, port tidak terbuka.

Mungkin perlu disebutkan bahwa, secara teknis, ini bukan port yang terbuka, tetapi host: kombinasi port. Misalnya, jika Anda terhubung ke LAN sebagai 10.0.1.2, Anda dapat mengikat soket ke 127.0.0.1.195955, atau 10.0.1.2-5955, tanpa salah satu yang mempengaruhi yang lain, atau Anda dapat mengikat ke 0.0.0.0 : 5955 untuk menangani keduanya sekaligus. Anda dapat melihat semua alamat IPv4 dan IPv6 komputer Anda dengan ifconfigperintah.


24

port find 5900 sangat sederhana:

sudo lsof -i :5900

kemudian mempertimbangkan 59553 sebagai PID

sudo kill 59553

1
Ini tidak menambahkan apa pun ke jawaban yang ada!
hatef

16

Di tahun 2018 inilah yang berhasil bagi saya menggunakan MacOS HighSierra:

sudo lsof -nPi: yourPortNumber

kemudian:

sudo kill -9 yourPIDnumber


1
lsof -nPisedikit lebih baik karena nomor port sebenarnya terlihat di output dan Anda mendapatkan perasaan yang lebih baik tentang apa yang Anda bunuh.
Rich Stone

1
Juga membantu hanya untuk melihat info semua port yang mendengarkan:sudo lsof -nPi | grep LISTEN
leanne

14

Satu liner adalah yang terbaik

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

Contoh: Di mac, ingin menghapus port 9604. Perintah berikut berfungsi seperti mantra

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

6

Anda juga dapat menggunakan perintah pertama ini untuk membunuh proses yang memiliki port tertentu:

sudo netstat -ap | grep :<port_number>

Misalnya, katakanlah proses ini menampung port 8000 TCP, kemudian jalankan perintah:

sudo netstat -ap | grep :8000

akan menampilkan garis yang sesuai dengan proses yang menahan port 8000 , misalnya:

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

Dalam hal ini, procHoldingPort adalah nama proses yang membuka port, 4683 adalah pid, dan 8000 (perhatikan bahwa itu adalah TCP) adalah nomor port yang dipegangnya (yang ingin Anda tutup).

Kemudian bunuh prosesnya, ikuti contoh di atas:

kill  4683

Seperti yang disebutkan di sini, jika itu tidak berhasil (Anda dapat mencoba menggunakan kill dengan -9 sebagai argumen):

kill -9 4683

Sekali lagi, secara umum, lebih baik untuk menghindari pengiriman SIGKILL (-9) jika Anda bisa.

Bersulang,

Orang.


5

Saya menggunakan lsofdikombinasikan dengankill , sebagaimana disebutkan di atas; tetapi menulis skrip bash kecil cepat untuk mengotomatisasi proses ini.

Dengan skrip ini, Anda cukup mengetik killport 3000dari mana saja, dan itu akan mematikan semua proses yang berjalan di port 3000.

https://github.com/xtrasimplicity/killport


1
Kamu menyelamatkan hariku. Untuk beberapa alasan lsofdikombinasikan dengan killtidak mengembalikan apa pun dan membuat skrip saya bertahan macOS Sierra. Tetapi killportbekerja seperti pesona dan lebih cepat. Terima kasih!
Wout

4

Saya telah membuat fungsi untuk tujuan ini.

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

Salin & tempel blok kode ini di terminal Anda harus membebaskan port yang Anda inginkan. Ingatlah untuk mengubah nomor port di baris terakhir.


3

coba di bawah, dengan asumsi port yang sedang berjalan adalah 8000:

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

Saya menemukan referensi di sini


1

Ketika program yang membuka port keluar, port akan ditutup secara otomatis. Jika Anda mematikan proses Java yang menjalankan server ini, itu harus dilakukan.


-1
  1. Pertama temukan Procees id (pid) yang telah menempati port yang diperlukan. (Mis. 5434)

    ps aux | grep 5434

2. bunuh proses itu

   kill -9 <pid>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.