是否有可能在python中杀死正在侦听特定端口的进程,例如8080?

时间:2013-12-19 20:40:25

标签: python python-2.7

是否有可能在python中杀死正在侦听特定端口的进程,例如8080?

我可以执行netstat -ltnp | grep 8080kill -9 <pid>或者从python执行shell命令但我想知道是否已经有一些模块包含按端口或名称终止进程的API?

6 个答案:

答案 0 :(得分:9)

您可以使用psutil python module。一些未经测试的代码应该指向正确的方向:

from psutil import process_iter
from signal import SIGTERM # or SIGKILL

for proc in process_iter():
    for conns in proc.connections(kind='inet'):
        if conns.laddr.port == 8080:
            proc.send_signal(SIGTERM) # or SIGKILL

答案 1 :(得分:2)

在端口上终止进程的最简单方法是使用python库:freeport(https://pypi.python.org/pypi/freeport/0.1.9)。安装完成后,只需:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

可在此处获取实施详情:https://github.com/yashbathia/freeport/blob/master/scripts/freeport

答案 2 :(得分:1)

首先,进程在端口上运行 - 进程可以绑定到特定端口。特定端口/ IP组合只能在给定时间点由单个进程绑定。

正如Toote所说,psutil为您提供netstat功能。您也可以使用os.kill发送终止信号(或者使用Toote的方式)。

答案 3 :(得分:1)

我尝试过这种方法,对我有用。.

import os
import signal
import subprocess

command = "netstat -ano | findstr 8080"
c = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr = subprocess.PIPE)
stdout, stderr = c.communicate()
pid = int(stdout.decode().strip().split(' ')[-1])
os.kill(pid, signal.SIGTERM)

答案 4 :(得分:0)

您可以通过子进程执行此操作,然后杀死它。

import os
import signal
from subprocess import Popen, PIPE

port = 1234
process = Popen(["lsof", "-i", ":{0}".format(port)], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
for process in str(stdout.decode("utf-8")).split("\n")[1:]:       
    data = [x for x in process.split(" ") if x != '']
    if (len(data) <= 1):
        continue

    os.kill(int(data[1]), signal.SIGKILL)

答案 5 :(得分:0)

我使用的上述解决方案的变体:

import os
import signal
import subprocess

command = 'lsof -t -i:' + str(pid)
c = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr = subprocess.PIPE)
stdout, stderr = c.communicate()
if stdout == b'':
    return
pid = int(stdout.decode())
os.kill(pid, signal.SIGTERM)