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. F(x) HDU - 4734

    题意: 给你一个n位的数x(A(n)A(n-1)...A(1)),那么F(x)=A(n)*2^(n-1)+A(n-1)*2^(n-2)......+A(1)*2^(0) 题目输入A.B 你需要找出来在 ...

  2. 洛谷P1119-灾后重建-floyd算法

    洛谷P1119-灾后重建 题目描述 给出\(B\)地区的村庄数NN,村庄编号从\(0\)到\(N-1\),和所有\(M\)条公路的长度,公路是双向的. 给出第\(i\)个村庄重建完成的时间\(t_i\ ...

  3. MHA 高可用介绍

    目录 MHA 介绍 MHA 简介(Master High Availability) MHA 工作原理(转载) MHA 架构 MHA 工具 Manager 节点 Node 节点 MHA 优点 MHA ...

  4. IDEA 安装常用操作二

    一.IDEA启动慢,因为启动时编译.缓存.创建索引等,如果断电等启动异常,可以让缓存索引失效 迁移IDEAD时,可以找到config.system等文件夹, 随着时间使用越久,空间占用越大,另外觉得浪 ...

  5. 英语能力考试 All In One

    英语能力考试 All In One 托福,雅思,托业 TOEIC 托业考试 Test of English for International Communication (TOEIC) 国际交流英语 ...

  6. Cocos Creator 游戏开发

    Cocos Creator 游戏开发 https://www.cocos.com/products#CocosCreator 一体化编辑器: 包含了一体化.可扩展的编辑器,简化了资源管理.游戏调试和预 ...

  7. js 实现各种数据结构 APP

    js 实现各种数据结构 APP 常见数据结构: 数组,队列,栈,堆,链表,集合,字典,散列表,树, 图 Array, Queue, Link, Collection, Set,Map, HashMap ...

  8. vue 使用stylus

    λ yarn add stylus stylus-loader --dev <style scoped lang="stylus"> div color #ff4488 ...

  9. SPEC-RFC3261总述

    最近学习VoLTE(Voice Vver LTE)相关知识,而学习VoLTE必须要学相关的协议,最基础的就是RFC3261,RFC3261的全称是:SIP: Session Initiation Pr ...

  10. 文件I/O的内核缓冲

    本文转载自文件 I/O 的内核缓冲 导语 从最粗略的角度理解 Linux 文件 I/O 内核缓冲(buffer cache),啰嗦且不严谨.只为了直观理解. 当我们说一个程序读写磁盘上的文件时,通常指 ...