Shell 起停脚本 专题
2017-08-25 00:25
197 查看
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
start.sh
在跑shell代码时遇到如下错误提示:
行 175: 语法错误: 未预期的文件结尾。
引用一位网友的话“shell不会对错误进行精确定位,而是在试图结束一个语句时进行错误统计。所以在shell打印出一个脚本错误后,不要只看那些疑问行,而是要观察整个相关代码段.”
centos7
①先查询之前的进程ID
②杀死之前的,在启动新了
时间长了弄得我很烦躁,所以就琢磨下,把上面的的操作一起整合到启动脚本里去。
最开始我是这么写的:
执行了一下,OK
结果:
假设进程早已手动杀死,在执行上面的脚本:
结果提示:
虽然不影响后面的命令,依然启动了程序。但是总是报这个也不好看。
所以我打算加上if判断
else
fi
特别注意上面
最后我调整后的脚本为:
简单讲解:
①先执行
②进行判断,要是进程没有被杀死,就执行
③后台启动程序(我这里是启动jar包),最后打印启动的新
注意:由于我的脚本名和查询进程名类似,所以
这里也贴出网上收集的一些小技巧:
经过我大量测试:
上面的对未定义变量的判断也可以这么写:
这是不是说明:未定义变量,使用
不一一列举了
shell 变量未定义或空值导致test语句报错解决办法
http://blog.csdn.net/u013066244/article/details/70768664
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空格[空格判断表达式空格];thenelse
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常用招式大全之入门篇:http://www.imooc.com/article/1788shell 变量未定义或空值导致test语句报错解决办法
http://blog.csdn.net/u013066244/article/details/70768664
相关文章推荐
- 【Redis专题】管理Redis进程的Shell脚本
- shell脚本专题之-----------全自动编译安装mysql
- crontab运行shell脚本报sudo错误
- 关于Shell脚本效率优化的一些个人想法
- 使用getopt命令解析shell脚本的命令行选项
- 【SHELL】1 FTP脚本
- Linux脚本(shell)编程(三) 文件操作
- linux通过shell脚本修改文件内容
- Shell脚本模拟多线程功能分享
- shell脚本中的一些符号
- shell入门笔记(更新SVN脚本)
- shell脚本中,写文件的路径一定要写全路径。
- linux学习(四) shell脚本(1)
- 能够匹配任意长度的回文字的shell脚本 match_palindrome.sh
- Hive结合shell脚本实现自动化业务
- Shell脚本根据设备名自动获取设备号
- shell脚本七十问
- 制作service服务,shell脚本小例子(来自网络)
- shell 中for的测试脚本
- Shell脚本实现的一个简易Web服务器例子分享