最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux系統(tǒng)查找并終止占用特定端口的進(jìn)程的完整流程

 更新時(shí)間:2026年04月20日 08:53:32   作者:Java后端的Ai之路  
本文檔記錄了在Linux系統(tǒng)中如何查找并終止占用特定端口(如5501)的進(jìn)程的完整流程,適用于需要釋放被占用的端口、終止無(wú)響應(yīng)服務(wù)或清理異常進(jìn)程等場(chǎng)景,希望對(duì)大家有所幫助

問(wèn)題場(chǎng)景

需要終止占用5501端口的進(jìn)程,但系統(tǒng)中常用的網(wǎng)絡(luò)命令(如netstatlsofss等)不可用。

環(huán)境信息

  • 操作系統(tǒng):Linux (Debian)
  • 可用命令ps、catgrep、python3等基礎(chǔ)命令
  • 目標(biāo)端口:5501

完整操作流程

第一步:確認(rèn)端口被占用

使用Python腳本檢測(cè)端口是否被占用:

python3 -c "
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('127.0.0.1', 5501))
if result == 0:
    print('Port 5501 is in use')
else:
    print('Port 5501 is not in use')
sock.close()
"

輸出結(jié)果

Port 5501 is in use

第二步:查找端口對(duì)應(yīng)的Socket Inode

端口號(hào)在/proc/net/tcp文件中以十六進(jìn)制格式存儲(chǔ)。5501的十六進(jìn)制為157D。

cat /proc/net/tcp | grep -i 157D

輸出結(jié)果

   4: 00000000:157D 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 1990512643 1 0000000000000000 100 0 0 10 0                
  25: 0100007F:8562 0100007F:157D 06 00000000:00000000 03:0000085A 00000000     0        0 0 3 0000000000000000

字段解析

字段位置字段名稱(chēng)示例值說(shuō)明
第1個(gè)local_address00000000:157D本地地址(IP:端口),157D = 5501
第2個(gè)rem_address00000000:0000遠(yuǎn)程地址
第3個(gè)st0A連接狀態(tài)(0A=Listening)
第10個(gè)inode1990512643Socket Inode(關(guān)鍵字段)

十六進(jìn)制端口對(duì)照表

十進(jìn)制十六進(jìn)制
5501157D
220016
800050
44301BB
80801F90

第三步:查找Inode對(duì)應(yīng)的進(jìn)程PID

遍歷所有進(jìn)程的fd目錄,找到對(duì)應(yīng)socket inode的進(jìn)程:

for pid in $(ls /proc | grep -E '^[0-9]+$'); do
  if [ -d "/proc/$pid/fd" ]; then
    for fd in /proc/$pid/fd/*; do
      if [ -L "$fd" ]; then
        link=$(readlink "$fd" 2>/dev/null)
        if [[ "$link" == *"socket:[1990512643]"* ]]; then
          echo "Found PID: $pid"
          kill -9 $pid 2>/dev/null && echo "Killed process $pid"
        fi
      fi
    done
  fi
done

輸出結(jié)果

Found PID: 246253
Killed process 246253

第四步:驗(yàn)證端口已釋放

python3 -c "
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('127.0.0.1', 5501))
if result == 0:
    print('Port 5501 is still in use')
else:
    print('Port 5501 is now FREE')
sock.close()
"

輸出結(jié)果

Port 5501 is now FREE

原理說(shuō)明

/proc/net/tcp 文件結(jié)構(gòu)

Linux系統(tǒng)通過(guò) /proc/net/tcp 文件提供TCP連接信息:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  • local_address:本地IP地址和端口
  • inode:Socket inode號(hào),是查找進(jìn)程的關(guān)鍵
  • st:連接狀態(tài)(06=TIME_WAIT, 0A=LISTEN, 01=ESTABLISHED)

進(jìn)程與Socket的關(guān)聯(lián)

Linux中所有進(jìn)程信息都在/proc/目錄下:

  • /proc/[PID]/fd/:進(jìn)程打開(kāi)的文件描述符
  • 每個(gè)fd是一個(gè)指向?qū)嶋H文件或socket的符號(hào)鏈接
  • socket鏈接格式:socket:[inode_number]

查找流程圖

常用替代方法

方法1:使用 lsof(如果可用)

lsof -i :5501
kill -9 $(lsof -t -i :5501)

方法2:使用 netstat(如果可用)

netstat -tlnp | grep 5501
kill -9 <PID>

方法3:使用 ss(如果可用)

ss -tlnp | grep 5501
kill -9 <PID>

方法4:使用 fuser(如果可用)

fuser -k 5501/tcp

方法5:使用泊塢窗(如果可用)

docker ps --format "{{.Ports}}" | grep 5501
docker stop <CONTAINER_ID>

完整Python腳本

以下是一個(gè)完整的Python腳本,可以直接使用:

#!/usr/bin/env python3
"""
根據(jù)端口號(hào)查找并終止對(duì)應(yīng)進(jìn)程
用法: python3 kill_port.py <端口號(hào)>
"""
import subprocess
import sys
import re
def port_to_hex(port):
    """將端口號(hào)轉(zhuǎn)換為十六進(jìn)制"""
    return format(int(port), 'X').zfill(4).upper()
def find_inode(port):
    """查找端口對(duì)應(yīng)的inode"""
    hex_port = port_to_hex(port)
    try:
        with open('/proc/net/tcp', 'r') as f:
            lines = f.readlines()
            for line in lines[1:]:  # 跳過(guò)標(biāo)題行
                parts = line.split()
                if len(parts) > 9:
                    local_addr = parts[1]
                    if f':{hex_port}' in local_addr:
                        return parts[9]
    except Exception as e:
        print(f"Error reading /proc/net/tcp: {e}")
    return None
def find_pid_by_inode(inode):
    """根據(jù)inode查找進(jìn)程PID"""
    try:
        # 遍歷所有進(jìn)程的fd目錄
        result = subprocess.run(['ls', '/proc'], capture_output=True, text=True)
        pids = re.findall(r'\d+', result.stdout)
        for pid in pids:
            fd_dir = f'/proc/{pid}/fd'
            try:
                result = subprocess.run(['ls', '-l', fd_dir], capture_output=True, text=True)
                if f'socket:[{inode}]' in result.stdout:
                    return pid
            except:
                continue
    except Exception as e:
        print(f"Error finding PID: {e}")
    return None
def kill_process(pid):
    """終止進(jìn)程"""
    try:
        subprocess.run(['kill', '-9', pid])
        return True
    except Exception as e:
        print(f"Error killing process: {e}")
        return False
def check_port(port):
    """檢查端口是否被占用"""
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    result = sock.connect_ex(('127.0.0.1', int(port)))
    sock.close()
    return result == 0
def main():
    if len(sys.argv) != 2:
        print(f"用法: {sys.argv[0]} <端口號(hào)>")
        sys.exit(1)
    port = sys.argv[1]
    print(f"正在查找占用端口 {port} 的進(jìn)程...")
    # 檢查端口是否被占用
    if not check_port(port):
        print(f"端口 {port} 未被占用")
        sys.exit(0)
    # 查找inode
    inode = find_inode(port)
    if not inode:
        print(f"無(wú)法找到端口 {port} 對(duì)應(yīng)的inode")
        sys.exit(1)
    print(f"找到 inode: {inode}")
    # 查找PID
    pid = find_pid_by_inode(inode)
    if not pid:
        print(f"無(wú)法找到占用端口 {port} 的進(jìn)程")
        sys.exit(1)
    print(f"找到進(jìn)程 PID: {pid}")
    # 終止進(jìn)程
    if kill_process(pid):
        print(f"成功終止進(jìn)程 {pid}")
        # 驗(yàn)證端口已釋放
        if not check_port(port):
            print(f"端口 {port} 已成功釋放")
        else:
            print(f"警告: 端口 {port} 仍被占用")
    else:
        print(f"終止進(jìn)程失敗")
if __name__ == '__main__':
    main()

使用方法

chmod +x kill_port.py
python3 kill_port.py 5501

注意事項(xiàng)

權(quán)限問(wèn)題:終止進(jìn)程可能需要root權(quán)限,使用sudo或以root用戶(hù)運(yùn)行

進(jìn)程依賴(lài):終止進(jìn)程可能影響依賴(lài)該服務(wù)的其他功能

數(shù)據(jù)保存:確保已保存重要數(shù)據(jù),避免強(qiáng)制終止導(dǎo)致數(shù)據(jù)丟失

系統(tǒng)進(jìn)程:不要終止系統(tǒng)關(guān)鍵進(jìn)程(如sshd、supervisord等)

常見(jiàn)問(wèn)題

Q: 為什么lsof、netstat、ss等命令不可用?

A: 在某些精簡(jiǎn)的Linux系統(tǒng)中,這些命令默認(rèn)未安裝。可以使用Python腳本作為替代方案。

Q: 如何查看進(jìn)程信息?

ps aux | grep <PID>
cat /proc/<PID>/cmdline

Q: 如何查看端口對(duì)應(yīng)的服務(wù)?

cat /proc/<PID>/comm
cat /proc/<PID>/status

更新日志

日期版本描述
2026-04-191.0初始版本,記錄5501端口進(jìn)程終止流程

以上就是Linux系統(tǒng)查找并終止占用特定端口的進(jìn)程的完整流程的詳細(xì)內(nèi)容,更多關(guān)于Linux查找并終止特定端口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

和静县| 环江| 定结县| 高青县| 周至县| 成安县| 普洱| 安塞县| 家居| 涞水县| 荃湾区| 威信县| 贵阳市| 金门县| 泗洪县| 鹤岗市| 元氏县| 彭山县| 新化县| 望都县| 梓潼县| 鄂伦春自治旗| 确山县| 临漳县| 武冈市| 菏泽市| 东乌珠穆沁旗| 沽源县| 开平市| 孙吴县| 油尖旺区| 洛宁县| 辽宁省| 兴国县| 军事| 合川市| 东乡族自治县| 岑巩县| 英吉沙县| 始兴县| 屯门区|