本文转载自微信公众号“AirPython”,作者邢安国。转载本文请联系AirPython公众号.一、前言大家好,我是安国!在web开发中,经常会遇到“端口被占用”的场景。一般的解决方法是:使用lsof-i命令查询占用端口的进程的PID使用kill-9PID杀掉目标虽然进程只有2步,但我也觉得很繁琐,就是,您必须记住命令并输入两次。本文将编写一个shell脚本,实现一键查杀端口占用。2、与Python相比,shell脚本常用容易处理操作系统底层的业务,开发效率高。以MacOSX为例,在本地创建一个.sh文件。实现步骤如下:2-1定义过滤内容参数和命令行处理的端口号和端口号参数化过滤内容,然后在Shell脚本中给两个变量赋值。$1执行脚本第一个参数,即:端口号$2执行脚本第二个参数,即:filterprocesscommandcontent#要杀死的端口号port_be_kill=$1#过滤内容filter_content=$22-2获取返回值端口占用进程使用端口号组成lsof-i命令,执行这条命令,返回值赋给变量ip_status#获取Shell返回值ip_cmd='lsof-itcp:'$port_be_killecho"获取进程命令对应端口号:"$ip_cmdecho"过滤命令字符串为:"$filter_content#Executethecommandip_status=`$ip_cmd`注意:ip_status的数据类型为字符串2-3由于字符串转换为数组不方便PID过滤,我们需要将上面的ip_status变量以“空格”分割成一个数组#以空格分隔,转为数组变量array=(${ip_status///})2-4遍历数组,过滤PID首先,遍历上面的数组,提取每一个元素和然后过滤掉所有类型为number且最后一个值包含过滤内容的数据#判断数据类型functioncheck(){locala="$1"printf"%d""$a"&>/dev/null&&echo"integer"&&returnprintf"%d""$(echo$a|sed's/^[+-]\?0\+//')"&>/dev/null&&echo"integer"&&returnprintf"%f""$a"&>/dev/null&&echo"number"&&return[${#a}-eq1]&&echo"char"&&returnecho"string"}最后使用kill-9PID命令处理对应进程#遍历数组foriin"${!array[@]}";do#Note:赋值等No.=item="${array[i]}"前后不能有空格#注意:过滤16进制字符串#先转为字符串,再判断是否以0x开头#echo$itemif[[$item!=0x*]]then#非16进制数据,即:PIDif[$(check$item)="integer"]then#判断最后一个元素是否包含关键字#命令行是否包含关键字item_pre="${array[i-1]}"#echo$item_pre#echo$filter_contentif[[$item_pre=~$filter_content]]then#echo$item#调用kill-9pid命令杀死进程kill_cmd="kill-9"$itemecho$kill_cmd#执行命令,杀死进程$kill_cmdfififidone2-5设置Alias为了一键运行Shell脚本,我们使用Alias来设置一个ali至于修改“.bash_profile”文件的命令,将Shell脚本文件的完整路径和执行命令写到一个自定义的函数中#vim.bash_profile#aliasdefinekill_port(){cd/Users/xingag/desktop/work./kill_port_with_args.sh$1$2}aliaskp=kill_port2-6实战用source.bash_profile命令刷新配置文件,使Alias配置立即生效。如果现在8000被占用,我们只需要打开终端,输入“kp8000python”命令,就可以快速杀死目标进程。运行截图如下:4.最后需要指出的是,Linux需要预装lsof命令,以CentOS为例#Centos安装lsofyuminstalllsof如果是Windows,用来处理端口的shell脚本职业不同;需要用netstat/tasklist/taskkill命令改写。另外,PC端推荐使用GitBash执行shell脚本#Win处理端口占用#1,打开cmd终端cmd#2,找到端口占用的进程和PIDnetstat-aon|findstrPORT#3,根据PID查询进程名tasklist|findstrPID#4,使用taskkill命令或者在任务管理器drop进程中关闭
