以下脚本主要在 mac 上调试,centos7 上测试也可行,其他环境没有试过。
kill_by_port.sh
代码语言:javascript复制#!/bin/bash
#第 1 个参数为端口,默认为 8761
port=${1-8761}
echo "0.杀掉端口[$port]对应的进程"
#查询端口相关的进程信息,返回字符串
result=$(lsof -i:"$port") || exit
echo "1.根据端口查询进程: $result"
#将字符串转换为数组
array=($result)
#获取第 10 个参数为进程号
pid=${array[10]}
echo "2.根据进程查询结果取得进程号:$pid"
#如果取得进程号则杀掉
if [ -n "$pid" ]; then
echo "3.杀掉进程$pid"
kill -9 $pid
fi
进程号
为什么第 10 个参数是进程号,详细看一下 lsof -i:8761
的输出:
$ lsof -i:8761
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 398 xiayx 9u IPv6 0x20945d935f29749b 0t0 TCP localhost:8761->localhost:63519 (ESTABLISHED)
java 398 xiayx 10u IPv6 0x20945d935f29439b 0t0 TCP localhost:63346->localhost:8761 (ESTABLISHED)
java 398 xiayx 14u IPv6 0x20945d935e57723b 0t0 TCP *:8761 (LISTEN)
java 398 xiayx 22u IPv6 0x20945d935f2955fb 0t0 TCP localhost:8761->localhost:63346 (ESTABLISHED)
java 41642 xiayx 149u IPv6 0x20945d935f296e7b 0t0 TCP localhost:63519->localhost:8761 (ESTABLISHED)
从左到右从上到下数,COMMAND 是第 1 个,PID 是第 2 个,数到 398 就是第 10 个。理论上不完全准确,应该取第 3 行监听状态中的 PID。
下载脚本
根据端口杀进程
使用示例
下载脚本后,进入脚本所在目录,执行以下命令:
代码语言:javascript复制#赋予执行权限
$ chmod 777 ./kill_by_port.sh
#杀掉 8080 对应的进程
$ ./kill_by_port.sh 8080
源码地址
学习 shell 命令