Mac 根据端口杀掉对应的进程

日常开发中经常遇到端口被占用的场景,比如重启服务时提示 Address already in use。每次都要手动 lsof 查 PID 再 kill,比较繁琐。本文介绍一个一键脚本,输入端口号即可自动查找并终止进程。

查找端口占用

在 Mac 上,使用 lsof 命令查看端口占用情况:

lsof -i :8080

输出示例:

COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    48668  admin  984u  IPv6 0xa82bb0de100c848e      0t0  TCP *:8080 (LISTEN)

可以清楚地看到端口 8080 被 PID 48668java 进程占用。

如果只想要 PID,加 -t 参数:

lsof -ti :8080

一键杀掉端口脚本

将以下脚本保存为 kill-port.sh,放到某个脚本目录:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <port>"
    exit 1
fi

PORT=$1

PID=$(lsof -ti :"$PORT" 2>/dev/null)

if [ -z "$PID" ]; then
    echo "端口 $PORT 没有被占用"
    exit 0
fi

PROCESS_INFO=$(ps -p "$PID" -o pid,comm,user --no-headers 2>/dev/null | xargs)
echo "端口 $PORT 被以下进程占用:"
echo "  PID   进程名      用户"
echo "  $(echo "$PROCESS_INFO" | awk '{printf "%-6s %-11s %s", $1, $2, $3}')"

kill "$PID" 2>/dev/null
if [ $? -eq 0 ]; then
    echo "已杀掉进程 $PID"
else
    echo "杀掉进程 $PID 失败,尝试强制终止..."
    kill -9 "$PID" 2>/dev/null
    if [ $? -eq 0 ]; then
        echo "已强制终止进程 $PID"
    else
        echo "无法终止进程 $PID"
        exit 1
    fi
fi

赋予执行权限:

chmod +x kill-port.sh

使用方式:

./kill-port.sh 8080

输出效果

  • 端口未被占用:

    端口 8080 没有被占用
  • 端口被占用:

    端口 8080 被以下进程占用:
      PID   进程名      用户
      48668  java        admin
    已杀掉进程 48668

配置全局别名

~/.zshrc 中添加别名,让 killp 成为一个全局命令:

alias killp='/path/to/kill-port.sh'

然后重新加载 Shell 配置:

source ~/.zshrc

之后在任意目录下直接使用:

killp 18123
killp 8080

小结

  • lsof -ti :端口号 快速获取占用端口的 PID;
  • 封装为脚本实现一键查杀,普通 kill 失败自动升级为 kill -9
  • 配置为 Shell 别名,全终端可用,省去每次手动查找的麻烦。