终止监听指定端口的程序

-1 投票
2 回答
3468 浏览
提问于 2025-04-17 16:04

在主代码执行之前,我想检查一下某个端口是否开放。如果开放的话,我想先关闭这个端口,这样代码就可以“干净”地开始运行。

于是我在网上搜索,找到了这里的代码:

http://www.paulwhippconsulting.com.au/tips/63-finding-and-killing-processes-on-ports

但是我直接把那里的代码粘贴过来:

import os
import subprocess
import re

ports = ['1234','5678','9101']


popen = subprocess.Popen(['netstat', '-lpn'],
                         shell=False,
                         stdout=subprocess.PIPE)
(data, err) = popen.communicate()

pattern = "^tcp.*((?:{0})).* (?P[0-9]*)/.*$"
pattern = pattern.format(')|(?:'.join(ports))
prog = re.compile(pattern) #<---- error line
for line in data.split('\n'):
    match = re.match(prog, line)
    if match:
        pid = match.group('pid')
        subprocess.Popen(['kill', '-9', pid])

结果却报了个错。

 raise error, v # invalid expression
sre_constants.error: unknown specifier: ?P[

2 个回答

1

对于正在阅读的人来说,netstat 是一个只适用于Windows的命令。 如果你需要反复执行这个操作,可以注意一下,有一些pip包可以帮你完成这个任务!

  1. killport
  2. freeport
4

发帖的人忘记把他的代码进行HTML转义了!正确的代码如下:

import os
import subprocess
import re

ports = ['1234','5678','9101']


popen = subprocess.Popen(['netstat', '-lpn'],
                         shell=False,
                         stdout=subprocess.PIPE)
(data, err) = popen.communicate()

pattern = "^tcp.*((?:{0})).* (?P<pid>[0-9]*)/.*$"
pattern = pattern.format(')|(?:'.join(ports))
prog = re.compile(pattern)
for line in data.split('\n'):
    match = re.match(prog, line)
    if match:
        pid = match.group('pid')
        subprocess.Popen(['kill', '-9', pid])

注意,<pid>是在?P后面的。

撰写回答