1. 前言

大家好,我是安果!

在 Web 开发中,经常会遇到「端口被占用」的场景

常规解决方案是:

  • 使用 lsof -i 命令查询占用端口的进程 PID

  • 利用 kill -9 PID 干掉目标进程

虽然只有 2 步,我也觉得很繁琐,即:既要记住命令,又要输入两次

本篇文章将编写 Shell 脚本,来实现一键干掉端口占用

2. 实现

相比 Python,Shell 脚本常用于处理偏操作系统底层的业务,简单、开发效率高

以 Mac OSX 为例,在本地创建一个 .sh 文件,实现步骤如下:

2-1  定义端口号及过滤内容参数

将要处理的端口号及命令行过滤内容参数化,然后在 Shell 脚本中赋值给两个变量

  • $1

    执行脚本的第一个参数,即:端口号

  • $2

    执行脚本的第二个参数,即:过滤进程命令内容

# 要干掉的端口号
port_be_kill=$1 # 过滤内容
filter_content=$2

2-2  获取端口占用进程返回值

使用端口号组成 lsof -i 命令,执行这条命令,将返回值赋值给变量 ip_status

# 获取Shell返回值
ip_cmd='lsof -i tcp:'$port_be_kill echo "获取端口号对应的进程命令:"$ip_cmd
echo "过滤命令字符串为:"$filter_content # 执行命令
ip_status=`$ip_cmd`

注意:ip_status 数据类型为字符串

2-3  转为数组

由于字符串不便于 PID 过滤,我们需要将上面的 ip_status 变量按「空格」分割成一个数组

# 以空格来分隔,转为一个数组变量
array=(${ip_status// / })

2-4  遍历数组,过滤 PID

首先,遍历上面的数组,提取每一个元素

然后,过滤出所有类型为 number、并且上一个值包含过滤内容的数据

# 判断数据的类型
function check(){
local a="$1"
printf "%d" "$a" &>/dev/null && echo "integer" && return
printf "%d" "$(echo $a|sed 's/^[+-]\?0\+//')" &>/dev/null && echo "integer" && return
printf "%f" "$a" &>/dev/null && echo "number" && return
[ ${#a} -eq 1 ] && echo "char" && return
echo "string"
}

最后,使用 kill -9  PID 命令处理对应的进程

# 遍历数组
for i in "${!array[@]}"; do
# 注意:赋值等号=前后不能有空格
item="${array[i]}" # 注意:过滤十六进制字符串
# 先转为字符串,然后判断是否以0x开头
# echo $item
if [[ $item != 0x* ]]
then
# 非十六进制数据,即:PID
if [ $(check $item) = "integer" ]
then
# 判断上一个元素是否包含关键字
# 命令行是否包含关键字
item_pre="${array[i-1]}"
# echo $item_pre
# echo $filter_content
if [[ $item_pre =~ $filter_content ]]
then
# echo $item
# 调用kill-9 pid命令干掉进程
kill_cmd="kill -9 "$item
echo $kill_cmd
# 执行命令,干掉进程
$kill_cmd
fi
fi
fi
done

2-5  设置 Alias

为了一键运行 Shell 脚本,我们使用 Alias 给命令设置一个别名

修改「.bash_profile」文件,将 Shell 脚本文件的完整路径及执行命令写入到一个自定义的函数中

# vim .bash_profile
# alias定义
kill_port() {
cd /Users/xingag/Desktop/work
./kill_port_with_args.sh $1 $2
}
alias kp=kill_port

2-6  实战一下

使用 source .bash_profile 命令刷新配置文件,让 Alias 配置立即生效

假如现在 8000 被占用,我们只需要打开终端输入「kp 8000 python」命令即可以快速干掉目标进程

运行截图如下:

4. 最后

需要指出的是,Linux 下需要预先安装 lsof 命令,以 CentOS 为例

# Centos安装lsof
yum install lsof

如果是 Windows,处理端口占用的 Shell 脚本不一样;它需要使用 netstat/tasklist/taskkill 命令去改写

另外,PC 端执行 Shell 脚本建议使用 Git Bash

# Win处理端口占用
# 1、打开cmd终端
cmd # 2、查找端口占用的进程及PID
netstat -aon|findstr PORT # 3、根据PID查询进程名称
tasklist|findstr PID # 4、使用taskkill命令或在任务管理器中关掉进程

我已经将文中完整源码文件传到后台,关注公众号「 AirPython 」,后台回复「 kp 」即可获得

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

该死的端口占用!教你用 Shell 脚本一键干掉它!的更多相关文章

  1. shell脚本一键同步集群时间

    shell脚本一键同步集群时间 弋嘤捕大 椿澄辄 ψ壤 茇徜燕 ㄢ交涔沔 阚龇棚绍 テ趼蜱棣 灵打了个寒颤也没有去甩脱愣是拖着 喇吉辔 秋北酏崖 琮淄脸酷 茇呶剑 莲夤罱 陕遇骸淫  ...

  2. Centos 6.4上面用Shell脚本一键安装vsftpd

    Centos 6.4上面用Shell脚本一键安装vsftpd install.sh #!/bin/bash if [ `uname -m` == "x86_64" ];then m ...

  3. Centos 6.4上面用Shell脚本一键安装mysql 5.6.15

    Centos 6.4上面用Shell脚本一键安装mysql 5.6.15  #!/bin/bash if [ `uname -m` == "x86_64" ];then machi ...

  4. 安装完Ubuntu后通过shell脚本一键安装软件

    安装完Ubuntu后通过shell脚本一键安装软件 以下代码中#是单行注释 :<<! ! 是多行注释. 运行的时候需要把多行注释去掉. 比如把以下代码保存为install.sh, 那么在终 ...

  5. Shell脚本一键部署——源码编译安装MySQL及自动补全工具

    Shell脚本一键部署--源码编译安装MySQL及自动补全工具 编译安装MySQL 1.软件包 Mysql安装包 将安装包拖至/opt目录下,编辑一个脚本文件,将以下内容复制进去,然后source或者 ...

  6. Shell脚本一键安装LNMP环境

    https://sourceforge.net/projects/opensourcefile/files/ Nginx是一款高性能的HTTP和反向代理服务器.Nginx在反向代理,Rewrite规则 ...

  7. Shell脚本 | 一键卸载安卓App

    在平时工作的过程中,很多重复性内容可以通过运行脚本文件来代替.一次编写,就能带来很大的效率提升. 今天跟大家分享一个简单的 Shell 脚本,只有区区 20 行左右的代码. 因为有时候我们测试某个应用 ...

  8. Shell脚本 一键重启

    有个程序必须用 kill -9 pid号   关闭后,才能重新启动,每次都要手动查找pid号,麻烦容易出错,写个shell脚本 就三行很方便,自动查找pid号-关闭程序-重启程序 #!/bin/bas ...

  9. Centos7 Docker配置TLS认证的远程端口的证书生成教程(shell脚本一键生成)

    通过 TLS来进行远程访问 百度百科 - TLS.我们需要在远程 docker 服务器(运行 docker 守护进程的服务器)生成 CA 证书,服务器证书,服务器密钥,然后自签名,再颁发给需要连接远程 ...

随机推荐

  1. Codeforces Round #501 (Div. 3) B. Obtaining the String (思维,字符串)

    题意:有两个字符串\(S\)和\(T\),判断\(T\)是否能由\(S\)通过交换某位置的相邻字符得到,如果满足,输出交换次数及每次交换的位置,否则输出\(-1\). 题解:首先判断不满足的情况,只有 ...

  2. Atcoder Beginner Contest 168 D - .. (Double Dots) (BFS)

    题意:有\(n\)个房间,在这些房间中两两连\(m\)次条边,问除了第一个房间,其他房间走到第一个房间的最短路径,输出这个房间所连的上一个房间,如果走不到,输出\(no\). 题解:刚开始我写了一个d ...

  3. Mysql主从架构

    Mysql主从架构 1. 克隆虚拟机 克隆的虚拟机的网络适配,使得虚拟机可以进入局域网 vi /etc/sysconfig/network-scripts/ifcfg-eth0 删除 HWADDR所在 ...

  4. C++实现二叉树的基本操作:建立、遍历、计算深度、节点数、叶子数等

    题意: 代码实现: #include<iostream> #include<queue> #include<stack> using namespace std; ...

  5. dp的小理解

    这段时间刷dp,总结出了一个不算套路的套路. 1.根据题意确定是否有重叠子问题,也就是前面的状态对后面的有影响,基本满足这个条件的就可以考虑用dp了. 2.确定是dp后,就是最难的部分--如何根据题意 ...

  6. HTTP1.0和HTTP1.1以及HTTP2.0的区别

    (1)连接方面 HTTP1.0使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象.每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个对象,严重影响客户机和服务器的性能. H ...

  7. HDU 3341 Lost's revenge (AC自动机 + DP + 变进制/hash)题解

    题意:给你些分数串,给你一个主串,主串每出现一个分数串加一分,要你重新排列主串,最多几分 思路:显然这里开$40^4$去状压内存不够.但是我们自己想想会发现根本不用开那么大,因为很多状态是废状压,不是 ...

  8. Vue3(四)从jQuery 转到 Vue工程化 的捷径

    不会 webpack 还想学 vue 工程化开发 的福音 熟悉jQuery开发的,学习vue的简单使用是没用啥问题的,但是学习vue的工程化开发方式,往往会遇到各种问题,比如: webpack.nod ...

  9. prefetch vs preload vs prerender vs preconnect All In One

    prefetch vs preload vs prerender vs preconnect All In One 前端性能优化 prefetch 预获取 https://developer.mozi ...

  10. You, Me & SVG!

    You, Me & SVG! SVG refs code-school-you-me-svg https://www.youtube.com/watch?v=a8Y0L5q63y8 https ...