Bagaimana Anda membebaskan port yang ditahan terbuka oleh proses mati?


63

Seorang kolega saya baru-baru ini mengalami masalah di mana proses yang seharusnya mati masih terikat ke port jaringan, mencegah proses lain dari mengikat ke port itu. Secara khusus, netstat -a -bmelaporkan bahwa proses yang dinamai Systemdengan PID 4476 memiliki port 60001 terbuka, kecuali tidak ada proses dengan PID 4476 ada, setidaknya sejauh yang saya tahu.

Process Explorer dan Task Manager tidak mencantumkan PID 4476 (meskipun ada proses lain yang dinamai Systemdengan PID 4, yang memiliki rangkaian koneksi TCP yang tidak menyertakan 60001). taskkill /PID 4476juga melaporkan bahwa PID 4476 tidak dapat ditemukan.

Apakah ada cara untuk membunuh proses Sistem misterius ini untuk membebaskan port yang terikat saat ini? Apa yang dapat menyebabkan ini terjadi? Bagaimana mungkin ada proses yang tidak diketahui oleh Task Manager, Process Explorer, dan taskkill? Reboot berhasil memperbaiki masalah, tetapi saya ingin tahu apakah ada cara untuk memperbaikinya tanpa me-reboot.


Berapa lama Anda menunggu untuk melihat apakah port dirilis? Di negara mana koneksi (port) berada? Didirikan, Ditutup, Time_Wait?
joeqwerty

@joeqwerty: Kami menunggu setidaknya 15-20 menit. Sayangnya saya lupa status koneksi yang ada di = /.
Adam Rosenfield

20 tambang terdengar seperti masalah. Lain kali terjadi jalankan netstat dan periksa status koneksi, yang akan memberi Anda petunjuk tentang apa yang terjadi. Ketika Anda mengomentari jawaban mfinni, itu mungkin akibat perangkat lunak \ layanan Anda mogok.
joeqwerty

Jawaban:


58

Saya tahu ini adalah utas lama, tetapi jika ada orang lain yang memiliki masalah yang sama, saya telah ...

Apa yang mungkin terjadi adalah bahwa proses Anda memiliki port TCP terbuka ketika crash atau keluar tanpa secara eksplisit menutupnya. Biasanya OS membersihkan hal-hal ini, tetapi hanya ketika catatan proses hilang. Meskipun proses tersebut tampaknya tidak berjalan lagi, setidaknya ada satu hal yang dapat menyimpan catatan tentangnya, untuk mencegah penggunaan kembali PID-nya. Ini adalah keberadaan proses anak yang tidak terlepas dari orang tua.

Jika program Anda menghasilkan proses apa pun saat sedang berjalan, coba bunuh mereka. Itu harus menyebabkan catatan prosesnya dibebaskan dan port TCP dibersihkan. Rupanya windows melakukan ini ketika catatan dirilis tidak ketika proses keluar seperti yang saya harapkan.


1
Terima kasih tuan yang baik. Saya tidak percaya jawaban ini sangat rendah, terutama karena permintaan Google dipenuhi dengan jawaban "gunakan TCPView / use netstat & taskkill" yang tidak membantu dalam kasus ini. Dalam kasus saya, apa yang membantu adalah menjalankan ProcessExplorer dan mencari proses apa pun yang telah yatim piatu. Mematikannya memecahkan masalah.
gwiazdorrr

3
Terima kasih atas petunjuk Anda !! Proses membunuh anak yatim benar-benar memecahkan masalah.
Darkthread

Terima kasih!! Ini persis apa yang terjadi pada saya. Saya membunuh proses yatim piatu dan pelabuhan dibebaskan. Saya tidak yakin bagaimana mencari proses yatim menggunakan proses explorer, tapi saya tahu nama-nama proses yang melahirkan sehingga mudah ditemukan.
Grezzo

1
Kami memiliki masalah yang sama - dan menggunakan Process Explorer melihat bahwa Dr. Watson memegang PID lama. Kami mencari (Cari) untuk port yang berusaha dibuka layanan, dan kemudian melihat 3-4 entri untuk Dr. Watson dan PID yang digunakannya. Anehnya, kami tidak perlu secara implisit MEMBUNUH apa pun. Sepertinya proses itu 'membangunkannya' dan menghilang. Lain kali kami mencoba me-restart layanan, itu muncul dengan baik.
tresstylez

Masalah serupa dapat terjadi selama debugging dengan VS. Saya lampirkan VS ke proses, dan setelah beberapa siklus - situasi yang dijelaskan terjadi, tetapi tidak ada proses saya (termasuk anak-anak) yang pergi. Tetapi membunuh "vsjitdebugger" membantu.
Dmitry Azaraev

6

Apakah Anda mencoba menggunakan TCPView dan menutup koneksi? Saya tidak tahu apakah itu akan menunjukkan hubungan dalam skenario yang Anda gambarkan, karena saya belum pernah mengalami itu pada saya. Tapi itu satu-satunya hal yang bisa saya pikirkan jika ini terjadi lagi.

Apa prosesnya - apakah itu perangkat lunak komersial, atau sesuatu buatan sendiri? Tampaknya port 60001 digunakan oleh beberapa Trojan - Saya ingin tahu apakah itu bisa menjadi rootkit atau sesuatu yang bisa menyembunyikan diri dari OS? Mungkin ingin memberikan mesin yang baik sekali-dengan AV, mungkin sesuatu dari media bootable.


Tidak, kami tidak mencoba TCPView; Saya akan mengingatnya untuk masa depan jika itu terjadi lagi. Perangkat lunak ini adalah perangkat lunak internal kami yang menggunakan port 60001 - Saya hampir yakin bahwa proses menahan port terbuka adalah contoh sebelumnya dari perangkat lunak kami yang entah bagaimana tidak sepenuhnya mati. Itu mencegah peluncuran perangkat lunak lain.
Adam Rosenfield

Aplikasi Anda dapat mengatur opsi SO_REUSEADDR dari soket ke true sebelum mengikatnya. Itu seharusnya bisa menyelesaikan masalah Anda (ini bahkan lebih atau kurang wajib di * nix)
Stephane

3

Buka command prompt sebagai admin

  1. C: \ WINDOWS \ system32> netstat -ano | findstr: 7895

*** Ulangi langkah 2 sampai tidak ada lagi proses anak

  1. C: \ WINDOWS \ system32> proses wmic di mana (ParentProcessId = 1091) mendapatkan Keterangan, ProcessId

    Keterangan TeksId

    cmd.exe 1328

2.a. C: \ WINDOWS \ system32> proses wmic di mana (ParentProcessId = 1328) mendapatkan Keterangan, ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. ulangi ini sampai tidak ada lagi proses anak yang ditemukan

- Lalu bunuh semua proses anak

  1. C: \ WINDOWS \ system32> taskkill / F / PID 1128 SUKSES: Proses dengan PID 9500 telah dihentikan.

Perintah wmic adalah satu-satunya cara kami berhasil mengidentifikasi proses anak sebenarnya menjaga port kami terbuka. Terimakasih banyak.
K Erlandsson

Ini juga satu-satunya cara saya menemukan untuk memperbaiki masalah saya. Proses utama telah hilang dan proses anak berada pada status ditangguhkan, tetapi masih memegang port TCP dengan status "Mendengarkan". Terima kasih.
Gui

1

Saya telah menghadapi masalah yang sama sebelumnya, perintah netstat -a -n windows memberi saya daftar port terbuka dengan ID proses. Dari itu saya telah mengambil nomor port yang ingin saya tutup koneksi dan kemudian saya menutup koneksi menggunakan perangkat lunak TCPView. Ini berhasil untuk saya.


-4

Jika Anda pengguna windows maka ikuti langkah-langkah di bawah ini Langkah1: Buka jalur ini: Control Panel \ All Control Panel Items \ Administrative Tools

Langkah2: Klik pada layanan

Langkah 3: Hentikan layanan yang tidak diinginkan yang berjalan di port yang diinginkan.


-5

ps-id | grep processname

bunuh proses terkait

bunuh -9 pid pid

Bekerja dalam kasus saya


6
pertanyaan ini tentang Windows, bukan Linux
longneck
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.