Возможно ли в python убить процесс, который прослушивает определенный порт, например 8080?

Можно ли в python завершить процесс, который прослушивает определенный порт, например, 8080?

я могу сделать netstat -ltnp | grep 8080 а также kill -9 <pid> ИЛИ выполнить команду оболочки из python, но мне интересно, есть ли уже какой-нибудь модуль, который содержит API для уничтожения процесса по порту или имени?

8 ответов

Вы можете использовать модуль Python Psutil. Несколько непроверенных кодов, которые должны указать вам правильное направление:

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
            continue

Вы можете сделать это с помощью подпроцесса, а затем убить его.

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)

Пробовал этот способ, у меня работает..!

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)

Самый простой способ уничтожить процесс в порту - использовать библиотеку 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

Другой вариант — модуль killport python. Это было бы похоже наfreeport, но он используетpsutilпод капотом, так что он также предлагает поддержку Windows

      pip install killport

$ killport 3000
Killing:
❌ python3.7 (pid 47220) on port 3000

Прежде всего, процессы не работают на портах - процессы могут связываться с определенными портами. Определенная комбинация порт /IP может быть связана только с одним процессом в данный момент времени.

Как говорит Тут, psutil дает вам netstat функциональность. Вы также можете использовать os.kill послать сигнал об убийстве (или сделать это так, как сделал Тут).

Вариант вышеперечисленных решений, которые я использовал:

      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)

Для Linux, и если есть только один процесс, использующий порт (могут ли 2 процесса даже прослушивать один и тот же порт?)

      import subprocess
from time import sleep

def kill_process_using_port(port):
    pid = subprocess.run(
        ['lsof', '-t', f'-i:{port}'], text=True, capture_output=True
    ).stdout.strip()
    if pid:
        if subprocess.run(['kill', '-TERM', pid]).returncode != 0:
            subprocess.run(['kill', '-KILL', pid], check=True)
        sleep(1)  # Give OS time to free up the PORT usage

Другие вопросы по тегам