许多ADB奇怪的问题,都是源于5037端口被其他程序占用了,经常还是被各种XXX助手软件占用了~
怎么找到占用了5037端口的”元凶“呢?
首先,在CMD下,找到占用端口的进程PID
netstat -ano | findstr 5037 | findstr LISTENING
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 17024
通过这个PID,找到占用的程序
tasklist /FI "PID eq 17024"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
adb.exe 17024 Console 1 8,788 K
tasklist是Win下用来显示运行在本地或远程计算机上的所有进程的命令,/FI 是显示一系列符合筛选器指定的进程。
通过程序的名字,找到所在的路径
wmic process where name="adb.exe" get executablepath
ExecutablePath
C:\Android\sdk\platform-tools\adb.exe
最后是kill掉它
taskkill /F /PID 17024
这个过程也可以用Python保存起来,一键运行~
import subprocess
import os
def run_cmd(cmd, shell=True):
stdout, stderr = subprocess.Popen(cmd, shell=shell, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
if stderr:
print(stderr)
result = [i.decode('gbk') for i in stdout.splitlines()]
return result
def is_port_used(port=5037, kill=False):
"""端口占用检测
:param port: 端口号
:param kill: 是否kill掉占用端口的进程
:return:
"""
cmd = 'netstat -ano | findstr {} | findstr LISTENING'.format(port)
print(cmd)
result = run_cmd(cmd)
# print(result)
if result:
pid = result[0].split()[-1]
result = run_cmd('tasklist /FI "PID eq {0}"'.format(pid))
for i in result:
print(i)
program_name = result[-1].split()[0]
print("占用的程序是{}".format(program_name))
result = run_cmd('wmic process where name="{0}" get executablepath'.format(program_name))
print("占用的程序所在位置:{}".format(result[2]))
run_cmd("explorer {0}".format(os.path.dirname(result[2]))) # 打开所在文件夹
if kill:
run_cmd("taskkill /F /PID {0}".format(pid)) # 结束进程
else:
print('{}端口没有被占用'.format(port))
if __name__ == '__main__':
is_port_used(kill=False)
网友评论