windows – どのようにして、死んでいるが聞いているプロセスを終了させるのですか?

kill netstat process tcp windows

私はポート3000でリスンするアプリを開発しています。どうやらまだポートを聞いているインスタンスがあるようで、起動するたびにポートがすでに取られているため、リスナー(C#、TcpListenerですが、それは関係ありません)を作成することができません

今、アプリはタスクマネージャに存在しないので、そのアプリのPIDを見つけて終了させようとしたところ、このような興味深い結果になりました

C:\Users\username>netstat -o -n -a | findstr 0.0:3000
TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116
ERROR: The process "3116" not found.

前にこの行動を見たことがないが、誰か解決策を持っている人がいたら見てみたいと思うほど面白いと思った

UPDATE: プロセスエクスプローラーを立ち上げて3000で検索したら、これが出てきました

<Non-existent Process>(3000): 5552

右クリックして「ハンドルを閉じる」を選択しました。プロセスエクスプローラには表示されなくなりましたが、netstatにはまだ表示されていて、アプリがリスナーを起動するのを止めています

UPDATE 2: TCPView for Windowsを見つけました。CurrPortsと同様に、このツールで接続を閉じようとしても何も起こりません

  52  Srekel  2010-11-26


ベストアンサー

ソケットでの無限の待ち時間を避けるために、プログラムは setsockopt 関数 に SO_REUSEADDR と SO_RCVTIMEO パラメータを指定して使用しなければなりません

SO_REUSEADDR : Allows the socket to be bound to an address that is already in use.
SO_RCVTIMEO : Sets the timeout, in milliseconds, for blocking receive calls.

14  harrymc  2010-11-29


同じ問題が発生し、Microsoft SysinternalsのProcess Explorerを使用して、存在しなくなったプロセスIDを調べました

そのプロセスはいくつかの DrWatson プロセスによって参照されていることがわかりました。それらのプロセスを殺すことでポートが解放されました。DrWatsonはMicrosoftにメモリダンプを送るために使われており、クラッシュしたプロセスは当時数十GBのメモリを保持していたため、これには数時間かかっていました

12  David  2012-07-26


おそらく問題は、あなたのプロセスがソケットハンドルを継承した別の(子)プロセスを起動していて、そのプロセスがまだ実行されていることです

これを防ぐための方法はいろいろあります。ProcessStartInfo.UseShellExecute = true;

8  Nick Westgate  2012-04-18


私はあなたがCurrPortsを試してみるべきだと思います

CurrPortsは、ローカルコンピュータ上で現在開いているすべてのTCP/IPおよびUDPポートのリストを表示するネットワーク監視ソフトウェアです。リスト内の各ポートについて、そのポートを開いたプロセスに関する情報も表示され、プロセス名、プロセスのフルパス、プロセスのバージョン情報(製品名、ファイルの説明など)、プロセスが作成された時間、プロセスを作成したユーザなどが表示されます

さらに、CurrPortsでは、不要なTCP接続を閉じたり、ポートを開いたプロセスを終了させたり、TCP/UDPポート情報をHTMLファイルやXMLファイル、タブ区切りのテキストファイルに保存したりすることができます

また、CurrPortsでは、正体不明のアプリケーション(バージョン情報やアイコンのないアプリケーション)が所有する不審なTCP/UDPポートをピンク色で自動的にマークしています

alt text

7  Sathyajith Bhat  2010-11-27


は、ポートを継承する子プロセスが作成され、親プロセスがクラッシュし、子プロセスがポートを保持したままになっていることが根本的な原因である場合に、同様の問題が発生しました。解決策は、まだ実行中の子プロセスを特定して停止させることでした。この例では、既存のプロセスではないプロセスのPIDは7336でした

> wmic process get processid,parentprocessid | findstr/i 7336
7336             23828

このプロセスを停止するには

> taskkill /f /pid 23828

そして、これで問題は解決しました

4  Michael  2018-02-11


私は上記のコメントのすべてのソリューションを試してみましたが、1つは私のために働いていませんでした。私は研究を続けてきたと私は@Michaelのコメントとこのリンクhttps://serverfault.com/questions/181015/how-do-you-free-up-a-port-being-held-open-by-dead-processを使用して組み合わせであるこの答えを得た

  1. まず最初に、ポート番号を使って問題の原因となっているプロセスを見つける必要があります

    netstat -abno | findstr /i "listening"| find ":3000"
    TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING       3116
    
  2. 次に、@Michael のコードを使って親プロセス ID (ppid) を見つけなければなりません

    wmic process get processid,parentprocessid | findstr/i 3116
    3116             23828
    
  3. 次に、次のコードを使って子プロセスの ID を見つける必要があります

    wmic process where (ParentProcessId=23828) get Caption,ProcessId
    Caption        ProcessId
    wireguard.exe  27400
    
  4. 子プロセスから親プロセスまで、すべてのプロセスを終了させます

    taskkill /f /pid 27400
    taskkill /f /pid 3116
    taskkill /f /pid 23828
    

これで問題は解決しました

4  kato2  2020-07-07


プロセスエクスプローラ でプロセスを見ることができますか?はいの場合は、そこからそれを殺すことができますが、それが実際に何であるかを調査した後でなければなりません(プロセスにロードされたすべてのdllを見ることができます)

1  Jakub Konecki  2010-11-26


netstat コマンドに ‘-b’ フラグをつけてみてください。ポートを使用している実行ファイルの名前を教えてくれます。タスクマネージャでその実行ファイルを見つけて、そこで kill してください。それでもうまくいかない場合は、ポートを開いている実行ファイルを投稿してください

1  Ge3ng  2010-11-30


ここでは長引くという言葉に言及する必要があります

詳細はhttp://msdn.microsoft.com/en-us/library/ms739165.aspxに掲載されています

簡単に説明するとソケットシステムには、未送信のデータがある場合、ソケットを閉じた後もソケットをオープンしておくように指示するオプションがあります

C#アプリでは、Socket.SetSocketOptionで関連するオプションを指定することができます。http://msdn.microsoft.com/en-us/library/1011kecd.aspx

ここで述べたことはすべて送信とクライアントに関連していますが、私たちは仕事で同様の問題を抱えていたので、さらに検索してみると、ここにある例のようにリスナーに linger オプションを指定することができることがわかりました。http://msdn.microsoft.com/library/system.net.sockets.tcplistener.server.aspx

同僚の中には、アプリケーションの終了/終了後、約2分間はOSがポートを保持しているという話をしていた人もいました。それを考えると、ある程度の時間が経過してもポートが保持されているかどうかを聞いてみるのも面白いかもしれません

1  Andreas  2010-12-01


私もこの問題に遭遇しました。ようやく原因がわかりました。原因は、c/c++のpopenでメインプロセスが子プロセスを起動したことにあります。しかし、メインプロセスは pclose を呼び出す前にクラッシュ/シャットダウンしてしまいます。そうすると、ポートはメインプロセスをまだ生きているとみなして、そのプロセスをリスンするようになります

1  lorry.lee  2012-07-16


この問題は、デッドプロセスが1つ以上の子プロセスを起動した場合に発生する可能性があります。もしもの場合

BOOL WINAPI CreateProcess(
_In_opt_    LPCTSTR               lpApplicationName,
_Inout_opt_ LPTSTR                lpCommandLine,
_In_opt_    LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_    LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_        BOOL                  bInheritHandles,
_In_        DWORD                 dwCreationFlags,
_In_opt_    LPVOID                lpEnvironment,
_In_opt_    LPCTSTR               lpCurrentDirectory,
_In_        LPSTARTUPINFO         lpStartupInfo,
_Out_       LPPROCESS_INFORMATION lpProcessInformation
);

が子プロセスの起動に使用されていた場合、それは継承ハンドルの値に依存するので、 with

bInheritHandles = false

親プロセスが停止していて、クライアントプロセスがまだ実行中の場合、Windowsはポートをブロックしません

1  V15I0N  2015-06-16


ファイアウォールがインストールされていないのではないでしょうか?

ファイアウォールの中には、このような挙動を示すものがあり、ポートを開いたままにしておくことができます

もし持っている場合は、それを無効にしてからプログラムを起動して閉じてみて、何が起こるかを見てみてください

0  William Hilsum  2010-12-01


あなたのプロセスはシステムとしてリストアップされているので、ほとんどの場合、「システム」コマンドプロンプトで強制終了させることができます。システムアカウントは通常の管理者よりも多くの権限を持っています

cmd.exeのタスクをスケジューリングすることで、”System” cmd.exeを取得することができます(スケジューラはSystemとして実行されます)

at 15:23 /interactive "cmd.exe"

近い将来に何かのためにその時間を変更します。あなたがマシンコンソールにいることを確認してください(通常のターミナルサーバセッションにいる場合は、新しい cmd.exe が表示されません。コンソールにmstscログインするようにしてください)。他にも方法があると思いますが、これは過去に私のために働いていました

0  David Suarez  2011-05-18


私は xdebug で同じ問題を抱えていました

taskkill /pid xxxx “を使ってcmdでなんとか閉じました

ポートを使用しているプロセスのpidは “netstat -o “で取得できます

私の設定はwin 7 home premiumでした

0  Christoforos  2013-01-04


私も同じ問題を抱えていました。プロセスがクラッシュしている間、プロセスはデバッグされていましたが、サスペンド状態の vsjitdebugger.exe プロセスがまだ存在しており、これは明らかにデバッグされているプロセスを参照していました。その vsjitdebugger.exe プロセスを削除することで問題は解決しました

0  gpvos  2014-04-03


私も同じ問題を抱えていたので、.NETで修正しました

  • netstat -oでPIDを見つけることができます
  • プロセスxpで殺してください

netstat は pid を返すことはあっても、それに対応する実行ファイル名を返さないことがあることに注意してください!

0  eka808  2015-03-10


TCPViewとプロセスエクスプローラをハイブリッドに使うとうまくいきました。)最初にTCPViewでポートを使用しているプロセスIDを調べました。プロセスエクスプローラでプロセスを分離し、プロセスエクスプローラを使ってプロセスを終了させました

0  Sathiya Narayanan  2015-07-02


タイトルとURLをコピーしました