因为平时做的项目是前后端分离的,要单独给前端开一个端口让前端开发人员去调用接口调试,但是问题是每次代码改动都要为提供给前端的进程重新部署一次,且每次部暑要经过以下4个步骤
1,监听提供给前端开发人员调用的端口的进程pid
2,先杀掉进程,
3,然后再将项目打成war包
4,最后执行
且每一个步骤都要等待前一个步骤执行完毕才方便输入命令执行,所以重新操作麻烦且耗费时间。最后就写成了如下shell脚本bootDongjianMsApplication,
只需要sh bootDongjianMsApplication 手动执行一次,然后上面四个步骤则会依次被自动执行。
# 终止监听8089端口的程序
lsof -i:8089 |awk '{print $2}' | sed -n '2p' | xargs kill -9
# 启动程序
cd ../
cd git/dongjian-ms-internal/
mvn clean install -D maven.test.skip=true
cd target
java -jar dongjian-ms-internal-0.0.1-exec.war --server.port=8089
解释:
1, lsof -i:8089 为找到监听8089的程序及对应程序的pid
2,awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息。
awk处理过程: 依次对每一行进行处理,然后输出,命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
' ' 引用代码块
{ } 命令代码块,包含一条或多条命令
print 是awk打印指定内容的主要命令
$0 表示整个当前行
$1 每行第一个字段
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd //输出第1、3、6列字段,以制表符作为分隔符
执行效果下:
~$ lsof -i:8089
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 22394 netease 22u IPv6 0x6ae3bdab18452089 0t0 TCP *:8089 (LISTEN)
~$ lsof -i:8089 |awk '{print $2, $4, $1}'
PID FD COMMAND
22394 22u java
3,sed -n 是指定第几行
sed -n '2p' 表示获取结果的第2行
4,“xargs kill -9” 中的xargs命令是用来把前面命令的输出结果(这里是PID)作为“kill -9”命令的参数,并执行该命令。