天天看点

Shell 起停脚本 需求

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 

②杀死之前的,在启动新了

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

最开始我是这么写的:

1

2

3

4

5

6

7

执行了一下,OK 

结果:

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

结果提示:

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

所以我打算加上if判断

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

else 

fi

举个例子:

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

最后我调整后的脚本为:

8

9

简单讲解: 

①先执行<code>ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|awk '{printf $2}'</code>,找到我们要杀死的进程<code>ID</code>并赋值给变量<code>pid</code>。 

②进行判断,要是进程没有被杀死,就执行<code>kill -9</code>,进行强制杀死进程操作。 

③后台启动程序(我这里是启动jar包),最后打印启动的新<code>ID</code>。

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

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

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

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

运算符

描述

示例

-e filename

如果filename存在,则为真

[ -e /etc/profile ]

-d filename

如果filename为目录,则为真

[ -d /tmp/mydir ]

-f filename

如果filename为常规文件,则为真

[ -f /usr/bin/grep ]

不一一列举了

<a href="http://blog.csdn.net/hittata/article/details/7754456" target="_blank">shell 变量未定义或空值导致test语句报错解决办法</a>

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