可以使用psutil
模块获取进程和网络信息
import psutil
import pprint
for process in psutil.process_iter():
### find which ports is the listening (if any)
listening_ports = [conn for conn in process.get_connections() if conn.status == psutil.CONN_LISTEN]
if len(listening_ports) > 0:
print("PID: {}, Process Name: {}".format(process.pid, process.name))
print("Connections:")
pprint.pprint(listening_ports)
### You could check the desired process and terminate/kill it
# process.terminate()
示例在Windows上输出,该模块也支持Linux(全部列出监听进程):
PID: 664, Process Name: lsass.exe
Connections:
[connection(fd=-1, family=2, type=1, laddr=('0.0.0.0', 49155), raddr=(), status='LISTEN'),
connection(fd=-1, family=23, type=1, laddr=('::', 49155), raddr=(), status='LISTEN')]
PID: 904, Process Name: svchost.exe
Connections:
[connection(fd=-1, family=2, type=1, laddr=('0.0.0.0', 135), raddr=(), status='LISTEN'),
connection(fd=-1, family=23, type=1, laddr=('::', 135), raddr=(), status='LISTEN')]
PID: 1712, Process Name: SpiderOak.exe
Connections:
[connection(fd=-1, family=2, type=1, laddr=('127.0.0.1', 49201), raddr=(), status='LISTEN'),
connection(fd=-1, family=2, type=1, laddr=('0.0.0.0', 49258), raddr=(), status='LISTEN')]
有了这些信息,你可以找到你的进程,甚至与psutil.Process
方法terminate()
杀死它(发送SIGTERM
信号)或kill()
(发送SIGKILL
信号,就像kill -9
)
首先全部:这是一个坏主意。如果你不小心杀死了一些重要的东西呢?其次:你正在检查'EADDRINUSE'。即使在后台没有运行'server.py',你的代码可能会抛出它,因为OS没有足够的时间来重置套接字。一般你做错了! – freakish
我想知道如何去做。我不认为这是危险或不危险,或更安全的方式来完成这项任务? – user2003548
我喜欢避免在python中使用命令行,大多数情况下都有一个有用的模块,比如['psutil'](http://code.google。com/p/psutil /)在这种情况下,不幸的是我几乎没有任何经验,但你可以访问进程和网络信息(也许得到该端口上的程序绑定的pid) – KurzedMetal