Windows では、ポート 8080 を探して、.BAT ファイルを介して使用中のプロセスを強制終了しようとするものは何ですか?
13 に答える
開始するためのコマンドは次のとおりです。
FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P
バッチ ファイルに自信がある場合は、@ECHO
.
FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /PID %%P
異なる OS では、これを少し変更する必要があるかもしれないことに注意してください。たとえば、Windows 7tokens=5
では、tokens=4
.
これがどのように機能するか
FOR /F ... %variable IN ('command') DO otherCommand %variable...
これにより、 を実行command
し、その出力をループできます。各行は に詰め込まれ、好きな場所で何度でも %variable
展開できます。実際の使用では、たとえば.otherCommand
%variable
%V
"tokens=4 delims= "
これにより、各行を空白で分割し、その行の 4 番目のチャンクを取得して%variable
(この場合は%%P
) に詰め込むことができます。 delims
空に見えますが、その余分なスペースは実際には重要です。
netstat -a -n -o
実行して調べてください。コマンドラインのヘルプによると、「すべての接続とリッスン ポートを表示します。」、「アドレスとポート番号を数値形式で表示します。」、および「各接続に関連付けられた所有プロセス ID を表示します。」. 他の誰かが提案したので、これらのオプションを使用しましたが、たまたまうまくいきました:)
^|
これは、最初のコマンドまたはプログラム ( ) の出力をnetstat
取得し、それを 2 番目のコマンド プログラム ( ) に渡しfindstr
ます。これをコマンド文字列内ではなく、コマンド ラインで直接使用する場合は、|
代わりに^|
.
findstr :8080
これにより、渡されたすべての出力がフィルタリングされ、 を含む行のみが返されます:8080
。
TaskKill.exe /PID <value>
これは、プロセス ID を使用して、実行中のタスクを強制終了します。
%%P instead of %P
これは、バッチ ファイルで必要です。コマンドプロンプトでこれを行った場合は、%P
代わりに使用します。
Merlyn のソリューションを使用すると、Firefox のように他のアプリケーションが強制終了されました。これらのプロセスは同じポートを使用していましたが、リスナーとしては使用していませんでした:
例えば:
netstat -a -n -o | findstr :8085
TCP 0.0.0.0:8085 0.0.0.0:0 LISTENING 6568
TCP 127.0.0.1:49616 127.0.0.1:8085 TIME_WAIT 0
TCP 127.0.0.1:49618 127.0.0.1:8085 TIME_WAIT 0
したがって、次のように findstr に「LISTENING」を追加することで、これらを除外できます。
FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P
/F 強制スイッチも TaskKill で送信されない限り、一部のプロセスは閉じないことを付け加えておきます。また、/T スイッチを使用すると、プロセスのすべてのセカンダリ スレッドが閉じられます。
C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :2002') DO TaskKill.exe /PID %P /T /F
サービスの場合、サービスの名前を取得して実行する必要があります。
sc stop サービス名
以下の内容のbatファイルを作成し、ポート番号の入力を受け付けます
@ECHO ON
set /p portid=Enter the Port to be killed:
echo %portid%
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr %portid% ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine
:SkipLine
echo ProcessId to kill = %ProcessId%
taskkill /f /pid %ProcessId%
PAUSE
最後に「Enter」をクリックして終了します。
完成のために:
特定のポートに接続されているすべてのプロセスを強制終了したかったのですが、リッスンしているプロセスは強制終了しませんでした
ポート 9001 のコマンド (cmd シェル) は次のとおりです。
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P
検索文字列:
- r は式用で、c は一致する正確なチェーン用です。
- [ ]* は一致するスペース用です
netstat :
- a -> すべて
- n -> 解決しない (高速)
- o -> ピッド
netstat は送信元ポート、宛先ポート、ESTABLISHED の順に出力するため、機能します。
ポート 8080 でリッスンしているプロセスを強制終了する場合は、PowerShell を使用できます。コマンドレットGet-NetTCPConnection
をStop-Process
.
テスト済みで、Windows 10 または Windows Server 2016 上の PowerShell 5 で動作するはずです。ただし、PowerShell 5 がインストールされている古い Windows バージョンでも動作するはずです。
次に例を示します。
PS C:\> Stop-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess
Confirm
Are you sure you want to perform the Stop-Process operation on the following item: MyTestServer(9408)?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
手順:
Apache Tomcatサーバー
conf
のフォルダーに移動します。私の場合、apache-tomcat-7.0.61 を使用しています。apache-tomcat-7.0.61\conf
開い
server.xml
て、ポート番号を 8080 から必要に応じて他のポートに変更します。例: 8081,8082,8087 などbin
フォルダに移動して実行しますshutdown.bat
ここで、Eclipse を使用してサーバーを再起動します。
これで、プロジェクトは中断することなく機能します。
Merlyn の応答に似ていますが、これはこれらのケースも処理します。
- ポート番号は、実際には、探していない別の長いポート番号の左側の部分文字列です。無作為に無害なプロセスを強制終了しないように、正確なポート番号を検索する 必要があります。
- スクリプト コードは、複数回実行でき、毎回正しく、古い、間違った回答が表示されないようにする必要があります。
ここにあります:
set serverPid=
for /F "tokens=5 delims= " %%P in ('netstat -a -n -o ^| findstr /E :8080 ') do set serverPid=%%P
if not "%serverPid%" == "" (
taskkill /PID %serverPid%
) else (
rem echo Server is not running.
)