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 48668 的 java 进程占用。
如果只想要 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 别名,全终端可用,省去每次手动查找的麻烦。