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
shutdown.sh
#!/bin/bash
AppName="sns-api-1.0.1"
if ps -ef|grep $AppName|grep -v grep >/dev/null >& ; then
ps -ef|grep $AppName|grep -v grep|awk '{print $2}'|xargs kill - >/dev/null >&
echo "success to shutdown "$AppName
else
echo $AppName" not exist! do nothing. "
fi
start.sh
#!/bin/bash
APPNAME=sns-api-1.0..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 - $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 >& >>/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 - $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 >& >>/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/1788
http://blog.csdn.net/u013066244/article/details/70768664
Shell 起停脚本 专题的更多相关文章
- 生产力工具:shell 与 Bash 脚本
生产力工具:shell 与 Bash 脚本 作者:吴甜甜 个人博客网站: wutiantian.github.io 注意:本文只是我个人总结的学习笔记,不适合0基础人士观看. 参考内容: 王顶老师 l ...
- Linux 程序启停脚本
start.sh #!/bin/sh java -jar ./program.jar & echo $! > /var/run/program.pid stop.sh #!/bin/sh ...
- linux下的启停脚本
linux下的根据项目名称,进行进程的启停脚本 #!/bin/bash JAVA=/usr/bin/java APP_HOME=/opt/program/qa/wechat APP_NAME=prog ...
- Hadoop概念学习系列之Java调用Shell命令和脚本,致力于hadoop/spark集群(三十六)
前言 说明的是,本博文,是在以下的博文基础上,立足于它们,致力于我的大数据领域! http://kongcodecenter.iteye.com/blog/1231177 http://blog.cs ...
- Bash Shell启动配置脚本的顺序
1.Bash检查环境变量文件的方式,取决于系统运行Shell的方式,通常系统运行Shell有3种方式: )通过系统用户登陆后默认运行的Shell )非登陆交互式运行Shell )执行脚本运行非交互式S ...
- Shell执行将脚本里的变量打印到指定日志文件
首先需要定位获取任务的运行日志或者报错信息,才能定位问题. 通过shell调用有些脚本的话,日志信息会打印在shell里.不过也有用户在shell里调用正常,但是到crontab调用的时候就出错并且没 ...
- Shell编程-01-Shell脚本初步入门
目录 什么是Shell 什么是Shell脚本 Shell脚本语言的种类 常用操作系统默认Shell Shell 脚本的建立和执行 脚本规范 什么是Shell 简单来说Shell其实就是一个命令 ...
- Shell编程(脚本)的经常使用命令和语句
一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit ec ...
- shell调用python脚本,并且向python脚本传递参数
1.shell调用python脚本,并且向python脚本传递参数: shell中: python test.py $para1 $para2 python中: import sys def main ...
随机推荐
- How to Create Modifiers Using the API QP_MODIFIERS_PUB.PROCESS_MODIFIERS
In this Document Goal Solution Example Scripts Steps to verify the creation of modifier(s). ...
- Struts-ValueStack和OGNL总结
(1)ValueStack是一个借口,在Struts2中使用OGNL表达式实际上是使用实现了ValueStack接口类的OgnlValueStack,它是ValueStack的默认实现类. (2)Va ...
- ThreadPoolExecutor运行机制
最近发现几起对ThreadPoolExecutor的误用,其中包括自己,发现都是因为没有仔细看注释和内部运转机制,想当然的揣测参数导致,先看一下新建一个ThreadPoolExecutor的构建参数: ...
- mahout系列----Dirichlet 分布
Dirichlet分布可以看做是分布之上的分布.如何理解这句话,我们可以先举个例子:假设我们有一个骰子,其有六面,分别为{1,2,3,4,5,6}.现在我们做了10000次投掷的实验,得到的实验结果是 ...
- How to configure ODBC DSN in Client to access remote DB2 for Windows
How to configure ODBC DSN in Client to access remote DB2 for Windows MA Gen feng (Guangdong Unito ...
- 使用XStream是实现XML与Java对象的转换(4)--转换器
七.转换器(Converter) 我们程序中的POJO是千变万化的,而且需求也是千奇百怪的,所以XStream中的内置的转换器的功能不一定能够满足我们的要求,所以我们就需要自己构建转换器. 1,一个基 ...
- java安全——BASE64
这个主题主要是关于java安全的,应该来说算是个大杂烩吧,但是又不缺乏实用性,算是作为一个总结,用的时候可以作为参考. 1.使用BASE64加解密 在java加密技术中,BASE64算是一种最简单.最 ...
- 【转载】详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
实例:1,http://localhost/aaa/ (打开aaa中的index.php)结果:$_SERVER['QUERY_STRING'] = "";$_SERVER['RE ...
- ffmpeg 时间戳处理
视频的显示和存放原理 对于一个电影,帧是这样来显示的:I B B P.现在我们需要在显示B帧之前知道P帧中的信息.因此,帧可能会按照这样的方式来存储:IPBB.这就是为什么我们会有一个解码时间戳和一个 ...
- 了解与建设有中国特色的Android M&N(Android6.0和7.0新特性分析)
http://geek.csdn.NET/news/detail/110434 Android N已经发布有段时间,甚至马上都要发布android 7.1,相信不少玩机爱好者已经刷入最新的Androi ...