根据端口杀进程

2020-07-06 10:39:42 浏览数 (1)

以下脚本主要在 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 的输出:

代码语言:javascript复制
$ 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 命令

0 人点赞