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

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

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

Shell 起停脚本 专题的更多相关文章

  1. 生产力工具:shell 与 Bash 脚本

    生产力工具:shell 与 Bash 脚本 作者:吴甜甜 个人博客网站: wutiantian.github.io 注意:本文只是我个人总结的学习笔记,不适合0基础人士观看. 参考内容: 王顶老师 l ...

  2. Linux 程序启停脚本

    start.sh #!/bin/sh java -jar ./program.jar & echo $! > /var/run/program.pid stop.sh #!/bin/sh ...

  3. linux下的启停脚本

    linux下的根据项目名称,进行进程的启停脚本 #!/bin/bash JAVA=/usr/bin/java APP_HOME=/opt/program/qa/wechat APP_NAME=prog ...

  4. Hadoop概念学习系列之Java调用Shell命令和脚本,致力于hadoop/spark集群(三十六)

    前言 说明的是,本博文,是在以下的博文基础上,立足于它们,致力于我的大数据领域! http://kongcodecenter.iteye.com/blog/1231177 http://blog.cs ...

  5. Bash Shell启动配置脚本的顺序

    1.Bash检查环境变量文件的方式,取决于系统运行Shell的方式,通常系统运行Shell有3种方式: )通过系统用户登陆后默认运行的Shell )非登陆交互式运行Shell )执行脚本运行非交互式S ...

  6. Shell执行将脚本里的变量打印到指定日志文件

    首先需要定位获取任务的运行日志或者报错信息,才能定位问题. 通过shell调用有些脚本的话,日志信息会打印在shell里.不过也有用户在shell里调用正常,但是到crontab调用的时候就出错并且没 ...

  7. Shell编程-01-Shell脚本初步入门

    目录 什么是Shell 什么是Shell脚本 Shell脚本语言的种类 常用操作系统默认Shell Shell 脚本的建立和执行 脚本规范 什么是Shell     简单来说Shell其实就是一个命令 ...

  8. Shell编程(脚本)的经常使用命令和语句

    一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit ec ...

  9. shell调用python脚本,并且向python脚本传递参数

    1.shell调用python脚本,并且向python脚本传递参数: shell中: python test.py $para1 $para2 python中: import sys def main ...

随机推荐

  1. 【Linux 操作系统】vim编辑器配置及常用命令

    最近工作不安分, 没有了刚入行时候的锐气, 不知道什么时候开始懈怠起来, 周末在电脑旁边看新闻, 搞笑图片, 追美剧, 一坐就是一天, 很是空虚. 我需要摆脱这种状态, 正好想学习一下安卓底层, An ...

  2. OpenCV问题集锦,图片显示不出来,WaitKey(0),imread()不能读图片,未经处理的异常,等问题集合

    昨天根据uc伯克利的人工图像分割文件.seg,显示图像的时候调用了OpenCV的库函数,图片都能用imwrite写好,但是imshow死活显示不出来. 今天早上发现原来是imshow()后面应该加上: ...

  3. 图像分割之(四)OpenCV的GrabCut函数使用和源码解读

    图像分割之(四)OpenCV的GrabCut函数使用和源码解读         分类:            图像处理            计算机视觉             2013-01-23 ...

  4. golang 常见疑惑总结

    经常会有一些朋友问go语言的一些问题和疑惑,其实好多问题在官方文档和stackoverflow里都有详细的讲解,只要你肯花时间读一遍官方文档和Effective Go基本上都有找到答案.本文总结一下大 ...

  5. JVM-GC工作原理

     配置Garbage Collection 2012-09-17 14:53:18 分类: Java   上面这幅图是我从网络上摘到的,它展现了在一个的理想系统的模型下GC对系统的影响.图的最顶上红色 ...

  6. 学习Spring Boot

    Spring boot 是什么 ? 简单说, spring boot 是一个构建项目的工具, 一个脚手架. Spring boot 能干什么? spring boot 做非常少的配置就可以构建生产级别 ...

  7. SQL 逻辑优化 case when 转为 union all

    通常数据库的优化从硬件层面去考虑可分为4个方面: CPU:即降低计算复杂度,如减少sql各类聚合函数,窗口函数,case when等. IO :(较少查询结果集过程中对数据的访问量.数据优化很大程度从 ...

  8. SQL解决数值间隔问题

    有表格存放每个顾客拥有的票.现在想查看哪些顾客的票不是连号,即有间隔.并找出间隔的开始与结束数字. create table tickets ( buyer_name char(5) not null ...

  9. mongodb常用语句

    一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...

  10. Tornado、Bottle以及Flask

    最近接手一个Tornado项目代码,项目要在原有基础上做很大扩展,为了更好地吃透并扩展好这个项目,就对Tornado以及比较轻型的Bottle.Flask这些框架一一作了调研.其实若干年前做第一个Py ...