shell 批量关闭端口

在开发小程序的时候 频繁的 npm run dev 每次都会占用一个端口。

为了一起杀死这些连续的端口,特意写了一个shell脚本。

建shell文件:

1
2
sudo vi kill_port.sh
sudo chmod 755 kill_port.sh

shell内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
!/bin/bash
read -p "输入 你要kill的端口号起始值(例如: 8081 8082,若只输入一个则只操作当前端口号): " a b
#判断变量是否输入
if [[ -z $a && -z $b ]]; then
echo "请输入至少一个端口号";
fi
#如果不输入其中一个则只生效另一个
if [ -z $a ]; then
a=$b;
fi
if [ -z $b ]; then
b=$a;
fi
#k 计数变量
let N=0;
for ((i=$a; i<=$b; i ++))
do
for j in lsof -i:$i | awk '{print $2}' | grep -v 'PID';
do
kill -9 $j;
N=expr $N + 1;
echo -e "\033[37m $i port kill done! \033[0m";
done
done
echo -e "\033[41;37m 共关闭 $N 个端口号 \033[0m";

操作实例:

不熟悉shell的朋友可以继续看下去,了解shell的朋友可绕过。

接下来,我详细说明一下这个shell内容:

1、起始行就不用说了

1
#!/bin/bash

2、read

1
read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显)

3、if[[ ]]

在命令行里test expr和[ expr ]的效果相同。
test的三个基本作用是判断文件、判断字符串、判断整数。支持使用 ”与或非“ 将表达式连接起来。
test中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式。
无论是字符串比较还是整数比较都千万不要使用大于号小于号。当然,如果你实在想用也是可以的,对于字符串比较可以使用尖括号的转义形式, 如果比较"ab"和"bc":[ ab < bc ],结果为真,也就是返回状态为0.

[[ ]] 在shell中的一个命令,它就比test强大的多了。支持字符串的模式匹配(使用=~操作符时甚至支持shell的正则表达 式)。逻辑组合可以不使用test的-a,-o而使用&& 。
字符串比较时可以把右边的作为一个模式(这是右边的字符串不加双引号的情况下。如果右边的字符串加了双引号,则认为是一个文本字符串。),而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。

4、-z

[ -z STRING ] “STRING” 的长度为零则为真。

[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。

1
lsof -i:$i  awk '{print $2}'  grep -v 'PID'

这个是linux 命令。

5、lsof -i :8082 知道8082端口被哪个进程占用

6、awk ‘{print $2}’

$2:表示第二个字段
print $2 : 打印第二个字段

grep 是查找含有指定文本行的意思,比如grep cpu 就是查找含有cpu的文本的行

grep -v 是反向查找的意思,比如 grep -v ‘PID’ 就是查找不含有 PID 字段的行

整个命令的意思就是:从查找的端口返回的内容中,找到每行的第二个字段,那就是 PID 和4218,再通过反向查找,去掉 PID,那就只剩下4218了。赋值给j

7、kill -15 $j;kill -9 $j

kill - 9 表示强制杀死该进程;而 kill 则有局限性,例如后台进程,守护进程等;

1) 关闭socket链接

2) 清理临时文件

3) 将自己将要被销毁的消息通知给子进程

4) 重置自己的终止状态

再说一下:

SIGNKILL(9) 和 SIGNTERM(15) 的区别在于: 
SIGNKILL(9) 的效果是立即杀死进程. 该信号不能被阻塞, 处理和忽略。 
SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理。并且它是Linux缺省的程序中断信号。

建议做法:先使用kill -15,然后再使用kill -9

8、expr

'expr’支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。

expr 对表达式的格式有几点特殊的要求:

  • 出现在表达式中的运算符、数字、变量和小括号的左右两边至少要有一个空格,否则会报错。
  • 有些特殊符号必须用反斜杠\进行转义(屏蔽其特殊含义),比如乘号*和小括号(),如果不用\转义,那么 Shell 会把它们误解为正则表达式中的符号(*对应通配符,()对应分组)。
  • 使用变量时要加$前缀。

9、echo -e

-e:激活转义字符。使用-e选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:

•\a 发出警告声;
•\b 删除前一个字符;
•\c 最后不加上换行符号;
•\f 换行但光标仍旧停留在原来的位置;
•\n 换行且光标移至行首;
•\r 光标移至行首,但不换行;
•\t 插入tab;
•\v 与\f相同;
•\ 插入\字符;
•\nnn 插入nnn(八进制)所代表的ASCII字符;

格式: echo -e “\033[字背景颜色;字体颜色m字符串\033[0m”
例如:echo -e “\033[37m $i port kill done! \033[0m”;
其中37代表字的颜色。 白色
例如:echo -e “\033[41;37m 共关闭 $N 个端口号 \033[0m”;
其中41的位置代表底色, 37的位置是代表字的颜色。 41 红色。

字背景颜色范围:40----49 
40:黑 
41:深红 
42:绿 
43:黄色 
44:蓝色 
45:紫色 
46:深绿 
47:白色

字颜色:30-----------39 
30:黑 
31:红 
32:绿 
33:黄 
34:蓝色 
35:紫色 
36:深绿 
37:白色

作者

sunct

发布于

2019-04-16

更新于

2020-12-24

许可协议


评论