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


63

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

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

この神秘的なシステムプロセスを強制終了して、現在バインドされているポートを解放する方法はありますか?これが起こる原因は何ですか?Task Manager、Process Explorer、およびtaskkillのいずれもが知らないプロセスがあるのはどうしてですか?再起動で問題は解決しましたが、再起動せずにこれを修正する方法があるかどうか知りたいです。


ポートがリリースされたかどうかを確認するためにどのくらい待機しましたか?接続(ポート)はどの状態でしたか?設立、閉鎖、Time_Wait?
joeqwerty

@joeqwerty:少なくとも15〜20分待ちました。残念ながら、接続が= /にあった状態を忘れています。
アダムローゼンフィールド

20分は問題のように聞こえます。次回、netstatを実行して接続の状態を確認すると、何が起きているのかがわかります。mfinniの答えにコメントしたように、それはソフトウェア\サービスがクラッシュした結果である可能性があります。
joeqwerty

回答:


58

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

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

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


1
よろしくお願いします。特にGoogleクエリには「TCPViewを使用/ netstatとtaskkillを使用」という回答があり、この場合は役に立ちません。私の場合、ProcessExplorerを実行して、孤立したプロセスを探していました。それらをシャットダウンすることで問題は解決しました。
-gwiazdorrr

3
ヒントをありがとう!孤立したプロセスを殺すことで問題は本当に解決しました。
ダークスレッド

ありがとう!! これはまさに私に起こったことでした。孤立プロセスを強制終了し、ポートがリリースされました。プロセスエクスプローラーを使用して孤立プロセスを検索する方法はわかりませんが、生成されたプロセスの名前はわかっていたため、簡単に見つけることができました。
グレッツォ

1
これと同じ問題がありました。ProcessExplorerを使用すると、ワトソン博士が古いPIDを保持していることがわかりました。サービスが開こうとしているポートを検索(検索)した後、ワトソン博士とそれが使用していたPIDの3〜4エントリが見つかりました。奇妙なことに、暗黙的に何も殺す必要はありませんでした。そのプロセスは「目を覚まし」、消えたようです。次にサービスを再起動しようとすると、問題なく起動しました。
tresstylez 14年

VSでのデバッグ中にも同様の問題が発生する可能性があります。私はVSをプロセスに接続し、いくつかのサイクルの後-説明された状況が発生しますが、私のプロセス(子を含む)は去りません。しかし、「vsjitdebugger」を殺すことは助けになります。
ドミトリーアザラエフ

6

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

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


いいえ、TCPViewは試しませんでした。それが再び起こる場合、私は将来のためにそれを心に留めておきます。このソフトウェアは、ポート60001を使用する社内ソフトウェアです。ポートを開いたままにするプロセスは、ソフトウェアの以前のインスタンスであり、どういうわけか完全には死ななかったことはほぼ確実です。そのため、ソフトウェアの別のコピーが起動しませんでした。
アダムローゼンフィールド

アプリケーションは、バインドする前に、ソケットのSO_REUSEADDRオプションをtrueに設定できます。これで問題が解決するはずです(* nixではさらに多かれ少なかれ必須です)
ステファン

3

管理者としてコマンドプロンプトを開きます

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

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

  1. C:\ WINDOWS \ system32> wmicプロセスwhere(ParentProcessId = 1091)get Caption、ProcessId

    キャプションProcessId

    cmd.exe 1328

2.a. C:\ WINDOWS \ system32> wmic process where(ParentProcessId = 1328)get Caption、ProcessId

  Caption  ProcessId

  conhost.exe  1128

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

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

  1. C:\ WINDOWS \ system32> taskkill / F / PID 1128成功:PID 9500のプロセスは終了しました。

wmicコマンドは、実際にポートを開いたままにする子プロセスを特定する唯一の方法でした。どうもありがとう。
K

これは、問題を解決する唯一の方法でもありました。メインプロセスはなくなり、子プロセスは一時停止状態になりましたが、「リスニング」状態でTCPポートを保持していました。ありがとうございました。
Gui

1

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


-4

Windowsユーザーの場合は、以下の手順に従ってください。ステップ1:このパスに移動します:コントロールパネル\すべてのコントロールパネルアイテム\管理ツール

ステップ2:サービスをクリックします

ステップ3:目的のポートで実行されている不要なサービスを停止します。


-5

ps -ef | grepプロセス名

関連プロセスを強制終了する

kill -9 pid pid

私の場合は働いた


6
この質問は、LinuxではなくWindowsについてです
ロングネック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.