web-dev-qa-db-ja.com

デッドプロセスによって開いたままになっているポートをどのように解放しますか?

私の同僚は最近、死んだと思われるプロセスがまだネットワークポートにバインドされていて、他のプロセスがそのポートにバインドできないという問題に遭遇しました。具体的には、netstat -a -bは、PID 4476のSystemという名前のプロセスがポート60001を開いていたと報告していましたが、少なくとも私が知る限り、PID 4476のプロセスは存在していませんでした。

プロセスエクスプローラーとタスクマネージャーはPID 4476を一覧表示しませんでした(ただし、独自のTCP接続が60001を含まない)接続のPID 4を持つSystemという名前の別のプロセスがありました) 。taskkill /PID 4476は、PID 4476が見つからなかったことも報告しました。

この不可解なシステムプロセスを強制終了して、現在バインドされているポートを解放する方法はありますか?これを引き起こす原因は何ですか?タスクマネージャー、プロセスエクスプローラー、タスクキルのいずれもが知らないプロセスがあるのはなぜですか。再起動しても問題は解決しましたが、再起動せずにこれを修正する方法があるかどうか知りたいのですが。

70
Adam Rosenfield

私はこれが古いスレッドであることを知っていますが、他の誰かが同じ問題を抱えている場合、私は持っていました...

発生している可能性があるのは、クラッシュしたとき、または明示的に閉じずに終了したときに、プロセスがTCPポートを開いていたということです。通常、OSはこれらの種類のものをクリーンアップしますが、プロセスレコードがプロセスはもう実行されていないように見えるかもしれませんが、PIDの再利用を防ぐために、プロセスの記録を保持できるものが少なくとも1つあります。これは、切り離されていない子プロセスの存在です親から。

プログラムの実行中にプロセスが生成された場合は、それらを強制終了してみてください。これにより、プロセスレコードが解放され、TCPポートがクリーンアップされます。どうやらWindowsは、レコードが解放されたときに、プロセスが予期したとおりに終了したときではなく、これを実行します。

60
Ogapo

TCPViewを使用して接続を閉じてみましたか?あなたが説明しているシナリオで接続が表示されるかどうかはわかりません。しかし、これが再び発生した場合、それは私が考えることができる唯一のことです。

プロセスは何でしたか-それは商用ソフトウェアですか、それとも自家製のものですか?一部のトロイの木馬がポート60001を使用しているようです-それがルートキットであるか、OSから身を隠すことができる何かだったのでしょうか?そのマシンにAVを使って良いものにしたいと思うかもしれません。

6
mfinni

管理者としてコマンドプロンプトを開く

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

***子プロセスがなくなるまでステップ2を繰り返します

  1. C:\ WINDOWS\system32> wmic process where(ParentProcessId = 1091)Caption、ProcessIdを取得

    キャプションProcessId

    cmd.exe 1328

2.a. C:\ WINDOWS\system32> wmicプロセス(ここで(ParentProcessId = 1328)はCaption、ProcessIdを取得)

  Caption  ProcessId

  conhost.exe  1128

2.b.子プロセスが見つからなくなるまでこれを繰り返します

-次に、すべての子プロセスを強制終了します

  1. C:\ WINDOWS\system32> taskkill/F/PID 1128 SUCCESS:PID 9500のプロセスが終了しました。
6
Srinivas

以前に同じ問題に直面しましたが、netstat -a -n windowsコマンドで、開いているポートとプロセスIDのリストが表示されました。それから、接続を閉じたいポート番号を取得し、TCPViewソフトウェアを使用してその接続を閉じました。これでうまくいきました。

1
Elavarasi