摘要:
流氓Java进程因停留已停止的服务而阻止了服务返回。
停止Java服务有时不会杀死Java进程,它会无休止地将其锁定在CLOSE_WAIT状态,因此当服务尝试返回时IP上仍在使用端口80,因此该服务无法启动
进行netstat -ano返回IP / PORT组合的PID,然后可以手动将其终止。 我想避免自己这样做。 我想在我们的服务重启脚本中添加一个部分,该部分将杀死处于CLOSE_WAIT状态的任何端口80进程。
我可以在Linux中轻松完成此操作:
$ netstat -anp |\
grep ':80 ' |\
grep CLOSE_WAIT |\
awk '{print $7}' |\
cut -d \/ -f1 |\
grep -oE"[[:digit:]]{1,}" |\
xargs kill
但是我的Windows批处理脚本技能相当差。
任何人都可以协助完成此任务的Windows吗?
听起来好像并没有真正杀死Java进程,也不是端口问题...
在这里,您可以使用一些东西(将其作为.bat运行):
echo off
netstat -ano | find"127.0.0.1:80" | find"CLOSE_WAIT"> out.txt
FOR /F"tokens=5 delims=" %%I IN (out.txt) DO (
TASKKILL %%I
)
del out.txt
可以将其作为单个命令来完成(没有.bat文件),但是我认为这更具可读性。
更新
对上面显示的脚本进行了改进,可以通过在管道的simbol(|)之前使用单引号和插入号(^)将管道命令括在for循环中来避免使用临时文件:
FOR /F"tokens=5 delims=" %%I IN (
'netstat -ano ^| find"127.0.0.1:80" ^| find"CLOSE_WAIT"'
) DO (
taskkill /PID %%I
)
for / F命令的帮助对其进行了更好的解释:
Finally, you can use the FOR /F command to parse the output of a command. You do this by making the file-set between the parenthesis a back quoted string. It will be treated as a command line, which is passed to a child CMD.EXE and the output is captured into memory and parsed as if it was a file. So the following example:
FOR /F"usebackq delims==" %i IN (set) DO @echo %i
将这个答案归功于插入符号解决方案
好的,我会试一试。 看起来很有希望。 有没有机会在没有输出文件的情况下执行此操作...?
查看答案更新:)
作品。 非常感谢。
我在端口8020上找到终止进程:C: Users stas> netstat -ano | 找到" 127.0.0.1:80" | 找到" CLOSE_WAIT" TCP 127.0.0.1:8020 127.0.0.1:21364 CLOSE_WAIT 10104 TCP 127.0.0.1:8020 127.0.0.1:21368 CLOSE_WAIT 10104 C: Users stas> taskkill / PID 10104错误:找不到进程" 10104" 。 问题是什么?
@Stan Zeez,您可以发表一个新问题吗? 很难读取像这样写的代码。