Возможно ли в 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