博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shell 起停脚本
阅读量:7099 次
发布时间:2019-06-28

本文共 2571 字,大约阅读时间需要 8 分钟。

 

To list any process listening to the port 8080:

lsof -i:8080

To kill any process listening to the port 8080:

kill $(lsof -t -i:8080)

or more violently:

kill -9 $(lsof -t -i:8080)

https://stackoverflow.com/questions/11583562/how-to-kill-a-process-running-on-particular-port-in-linux

 

centos7

需求

因为公司有个脚本,是用于启动程序的,但是每次启动都要手动做如下两个操作: 

①先查询之前的进程ID 
②杀死之前的,在启动新了

时间长了弄得我很烦躁,所以就琢磨下,把上面的的操作一起整合到启动脚本里去。 

最开始我是这么写的:

#!/bin/bashecho "ggjob-search..."pid=`ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|awk '{printf $2}'`echo "having kill pid:$pid" kill -9 $pid nohup java -Djava.ext.dirs=lib -Xms500m -Xmx500m -Dlog4j.configuration=file:/home/webuser/gogoal_platform/ggjob/config/log4j.properties -jar ggjob-search.jar config/config.properties 2>&1 >>/dev/null & echo "new pid:$!"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

执行了一下,OK 

结果:

ggjob-search...having kill pid:7018new pid:7209
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

假设进程早已手动杀死,在执行上面的脚本: 

结果提示:

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
  • 1
  • 1

虽然不影响后面的命令,依然启动了程序。但是总是报这个也不好看。

所以我打算加上if判断

shell if写法

if空格[空格判断表达式空格];then 

else 
fi

对未定义变量的判断

举个例子:

if [ "x${pid}" != "x" ];then echo "说明pid变量不为空" else echo "变量pid为空或未定义" fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

特别注意上面if那一行是没有一个多余的空格;也就是说,空格是必须的,否则会报语法错误。


最后我调整后的脚本为:

#!/bin/bashecho "ggjob-search..."pid=`ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|awk '{printf $2}'`if [ "X${pid}" != "X" ];then echo "having kill pid:$pid" kill -9 $pid fi nohup java -Djava.ext.dirs=lib -Xms500m -Xmx500m -Dlog4j.configuration=file:/home/webuser/gogoal_platform/ggjob/config/log4j.properties -jar ggjob-search.jar config/config.properties 2>&1 >>/dev/null & echo "new pid:$!"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

简单讲解: 

①先执行ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|awk '{printf $2}',找到我们要杀死的进程ID并赋值给变量pid。 
②进行判断,要是进程没有被杀死,就执行kill -9,进行强制杀死进程操作。 
③后台启动程序(我这里是启动jar包),最后打印启动的新ID

注意:由于我的脚本名和查询进程名类似,所以grep取反时,也要把脚本本身临时启动的进程ID过滤掉。


这里也贴出网上收集的一些小技巧:

判断变量a为空最好的方法是:[  -z string ]  [  -n  string  ]# 这种方式if [ -z $a  ];thenecho "${LINENO} a is null" fi # -z 如果string长度为零,则为真 # -n 如果string长度非零,则为真
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

经过我大量: 

上面的对未定义变量的判断也可以这么写:

# 经过我的测试使用-n 不能判断未定义变量if [ ! -z ${pid} ];thenecho "说明pid变量不为空" else echo "变量pid为空或未定义" fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这是不是说明:未定义变量,使用-n判断时,其string长度不为空,使用-z做判断时,其string长度为空。(我也不确定)

运算符 描述 示例
-e filename 如果filename存在,则为真 [ -e /etc/profile ]
-d filename 如果filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果filename为常规文件,则为真 [ -f /usr/bin/grep ]

不一一列举了

参考链接

 

http://blog.csdn.net/u013066244/article/details/70768664

你可能感兴趣的文章
通过FxCop来验证.NET编码规范
查看>>
四大MQ比较及MQ详解
查看>>
转:稳定排序和不稳定排序
查看>>
如果判断两个单链表有交?第一个交点在哪里?
查看>>
WPF中Ribbon控件的使用
查看>>
清理oracle的用户中的日志垃圾以及修改sys用户的密码
查看>>
胖AP基本配置:
查看>>
Nginx 虚拟主机 VirtualHost 配置
查看>>
http://src.chromium.org/svn/ 定制chrome浏览器教程及源码
查看>>
jmeter学习笔记--线程组
查看>>
T002 圆的有关运算
查看>>
T005 判断回文数
查看>>
NOIP 2002 提高组 字串变换
查看>>
C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)...
查看>>
问题集录06--SpringBoot创建Maven项目
查看>>
C语言位运算
查看>>
openresty安装
查看>>
网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
查看>>
关于this指向
查看>>
Ceph体系结构
查看>>