首页 > 系统相关 >Shell 起停脚本 专题

Shell 起停脚本 专题

时间:2022-12-12 11:31:38浏览次数:63  
标签:search 专题 grep 未定义 pid Shell kill ggjob 起停

 

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​

 

shutdown.sh

#!/bin/bash
AppName="sns-api-1.0.1"
if ps -ef|grep $AppName|grep -v grep >/dev/null 2>&1 ; then
ps -ef|grep $AppName|grep -v grep|awk '{print $2}'|xargs kill -9 >/dev/null 2>&1
echo "success to shutdown "$AppName
else
echo $AppName" not exist! do nothing. "
fi

start.sh

#!/bin/bash
APPNAME=sns-api-1.0.1.jar
nohup java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=prod -Xms600m -Xmx600m -jar ${APPNAME} >/dev/null &

 

 

 

在跑shell代码时遇到如下错误提示: 

行 175: 语法错误: 未预期的文件结尾。

引用一位网友的话“shell不会对错误进行精确定位,而是在试图结束一个语句时进行错误统计。所以在shell打印出一个脚本错误后,不要只看那些疑问行,而是要观察整个相关代码段.”

 

centos7

需求

因为公司有个脚本,是用于启动程序的,但是每次启动都要手动做如下两个操作: 
①先查询之前的进程ID 
②杀死之前的,在启动新了

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

#!/bin/bash
echo "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:$!"

执行了一下,OK 
结果:

ggjob-search...
having kill pid:7018
new pid:7209

 

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

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

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

所以我打算加上if判断

shell if写法

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

对未定义变量的判断

举个例子:

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

 

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


最后我调整后的脚本为:

#!/bin/bash
echo "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:$!"

 

简单讲解: 
①先执行​​​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 ];then
echo "${LINENO} a is null"
fi
# -z 如果string长度为零,则为真
# -n 如果string长度非零,则为真

 

经过我大量​​测试​​: 
上面的对未定义变量的判断也可以这么写:

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

 

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

运算符

描述

示例

-e filename

如果filename存在,则为真

[ -e /etc/profile ]

-d filename

如果filename为目录,则为真

[ -d /tmp/mydir ]

-f filename

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

[ -f /usr/bin/grep ]

不一一列举了

参考链接

Shell常用招式大全之入门篇

​​shell 变量未定义或空值导致test语句报错解决办法​​

 


 



标签:search,专题,grep,未定义,pid,Shell,kill,ggjob,起停
From: https://blog.51cto.com/u_15147537/5929308

相关文章