钻牛角尖还是走进死胡同--shell脚本根据名称获得 dubbo 服务的 pid

到了下午,突然觉得坐立不安,可能是因为中午没有休息好。老大不小了还在做页面整合的事情,这是参加工作时就干的工作了。然后突然想去挑战高级一点的缺陷排查,结果一不小心就钻了一个牛角尖。启动 dubbo 服务的shell 脚本总是让我觉得不爽,于是一研究,就不想干别的了,非要把它整顺不可。虽然买了鸟哥Linux私房菜的书,但没有认真看,很多东西都不记得了,只好度娘了一下午,但是度娘出来的结果质量不高,后来换了谷歌一下就搜索到高质量的文章。于是整明白了 Bash Shell 和 shell 脚本还是两码事,有些时候有点差异。

不过还是有点收获,整明白了 shell 脚本的一些坑。

假定我们要找的tomcat实例在tomcat-tuiguang/的目录下,看下shell脚本:

ps -ef | grep tomcat-tuiguang/ | grep -v grep | awk ‘{print $2}‘
这个脚本首先用ps -ef | grep tomcat-tuiguang/ 获得了进程信息中包含 tomcat-tuiguang/ 的进程信息,这样出来的结果中会包含grep本身,所以我们需要用 | grep -v grep 来排除grep本身,然后通过 awk ‘{print $2}‘来打印出要找的进程。

上述例子中只是将进程id号打印出来,当然也可以修改为将tomcat进程kill掉,如下脚本:

ps -ef | grep tomcat-tuiguang/ | grep -v grep | awk ‘{print $2}‘  | sed -e "s/^/kill -9 /g" | sh -

具体看如下的文章吧:

1. 原文地址:Bash Shell 获取进程 PID, 感谢原作者分享。

2.原文地址:shell脚本根据名称获得tomcat的pid

代码一:被调用的脚本(dubb_ctl_jar.sh)

#!/bin/sh

show_usage() {
    echo "Usage: xxx.sh xxx.jar ctrl"
    echo "**********************************************"
    echo "jar filename   - like this: base.jar"
    echo "ctrl   - like this:start|stop|restart"
    echo "**********************************************"
}

if [ $# -ne 2 ]; then
    show_usage
    exit 1
#else
#    echo "hah : $1"
fi

# 符合条件,进行dubbo服务操作
## java env
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
export JRE_HOME=$JAVA_HOME/jre

#SERVICE_NAME 根据传递的文件名截取 (b2b-service-base-0.0.1-SNAPSHOT.jar)
## you just need to change this param name
JAR_NAME=$1
APP_NAME=${JAR_NAME##*/}
APP_NAME=${APP_NAME%%.jar*}
SERVICE_DIR=/code/apps/dubbo_servers
SERVICE_NAME=$APP_NAME
#JAR_NAME=$SERVICE_NAME\.jar
PID=$SERVICE_NAME\.pid

cd $SERVICE_DIR

case "$2" in

    start)
        nohup $JRE_HOME/bin/java -Xms128m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &
        echo $! > $SERVICE_DIR/$PID
        echo "=== start $SERVICE_NAME"
        ;;

    stop)
        #根据服务名称获取进程,排除 shell 脚本自身的 pid
        P_ID=$(ps -ef | grep $SERVICE_NAME | grep ‘/bin/java‘ | grep -v grep | awk ‘{print $2}‘)

        if [ "$P_ID" == "" ]; then
            echo "=== $SERVICE_NAME process not exists or stop success"
        else
            echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
            kill `cat $SERVICE_DIR/$PID`
            rm -rf $SERVICE_DIR/$PID
            kill -9 $P_ID
        fi
        ;;

    restart)
        $0 stop
        sleep 2
        $0 start
        echo "=== restart $SERVICE_NAME"
        ;;

    *)
        ## restart
        $0 stop
        sleep 2
        $0 start
        ;;
esac
exit 0

代码二:开始的脚本(dubbo_ctl_start.sh),根据条件过滤文件名

#!/bin/sh
dubbo_folder="/code/apps/dubbo_servers"
echo start dubbo_servers
script_src=$(cd "$(dirname "$0")"; pwd)
#cd $dubbo_folder
cd $dubbo_folder
filelist=$(ls)
for file in $filelist
do
    if test -f $file
    then

        if [[ $file == *$".jar" ]] && [[ $file != *$"lucene"* ]] && [[ $file != *$"mail"* ]]  && [[ $file != *$"sms"* ]]  && [[ $file != *$"sns"* ]]
            then
               #echo 调用另外一个脚本传递参数,启动 dubbo 服务
               sh $script_src/dubbo_ctl_jar.sh $file start
            fi
    #else
    #    echo $file 是目录
    fi
done

cd $script_src

代码三:停止的脚本(dubbo_ctl_stop.sh),其实和开始脚本一样的

#!/bin/sh
dubbo_folder="/code/apps/dubbo_servers"
echo stoping dubbo_servers
#current path
script_src=$(cd "$(dirname "$0")"; pwd)
#cd $dubbo_folder
cd $dubbo_folder
rm -rf ./logs/*
filelist=$(ls)
for file in $filelist
do
    if test -f $file
    then

            if [[ $file == *$".jar" ]]
            then
               #echo 调用另外一个脚本传递参数,停止 dubbo 服务
               sh $script_src/dubbo_ctl_jar.sh $file stop
            fi
    #else
    #    echo $file 是目录
    fi
done

cd $script_src
时间: 2024-10-13 01:07:48

钻牛角尖还是走进死胡同--shell脚本根据名称获得 dubbo 服务的 pid的相关文章

linux shell脚本守护进程监控svn服务

最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在则启动. 创建监控脚本svnmonit.sh #! /bin/sh #进程名字可修改 PRO_NAME=svnserve PORT=58652 REP_DIR=/www/svndata while true ; do #用ps获取$PRO_NAME进程数量 NUM=`ps aux | grep ${

两个简单的shell脚本(关于启动和服务)

实验要求: 1.为root用户编写登陆欢迎脚本,报告当前主机中的进程数,已登陆用户数,根文件系统的磁盘使用率 2.编写三个脚本程序:start,stop和status,用来启动,停止各种系统服务 实验步骤: [[email protected] ~]# vi welcome.sh #!/bin/bash # this is test.by shengjie p=`ps aux | wc -l` //设置变量p echo "Running Processes:$p" u=`who | w

shell脚本杀掉(kill)端口号对应的PID进程

我是用的mac 就是当你本机启动一个python 端口进程, 即使关掉,后台进程依然存在,在启动同端口的进程,或报错提示已被占用 当你lsof -i:端口号(linux--(ss -anpt | grep 22)-->(ss是nestat的简写)) 又会发现不知一个pid进程 kill 很麻烦,所以就写了一个shell脚本,根据你输入的端口号,循环kill掉: #!/bin/bash read -p "输入 你要kill的端口号: " a for i in `lsof -i:$a

shell 脚本编写基础

在进行Linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入 ./smartzip就能运行脚本了.. 每行命令开头处不用就空格也行.. 第1部分. linux 脚本编写基础 1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执

Linux shell脚本的建立与执行

在进行linux测试时编写脚本是必不可少的.最近经常使用Linux,感觉太频繁地敲击键盘有些累了,于是想到了Shell脚本.可以把太多的命令写成一个脚本,这样每次执行一遍  shell文件,就可以省去了敲击键盘的时间.于是在网上搜了一些有关Linux下脚本编程的内容. Shell不仅仅是命令的收集,而且是一门非常棒的编程语言.您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性.可维护性和便携性比效率更重要的任务. 用户可以使用任何文本编辑器编辑shel

Shell 脚本自动安装cobbler(改进+填坑)

前言: 在这一篇博客写完后,虽然那个shell脚本可以成功安装cobbler服务,但是2个脚本毕竟不方便,而且在写脚本的过程中,出现的好多问题都没有找到原因.但我没有放弃,在我的不断摸索中,终于找到了原因和解决办法,现在分享给大家,希望对大家能有所帮助! 脚本环境 1.linux centos 7 系统2.系统可连接外网3.网络模式:NAT模式 实验步骤 1.上传cobbler脚本到Linux系统/root目录下 chmod +x *.sh 添加执行权限 2.脚本cobbler.sh详解 #!/

shell脚本每隔2s获取某个进程的cpu和mem数据并保存到csv文件

shell脚本每隔2s获取某个进程的cpu和mem数据并保存到csv文件 shell脚本如下echo "%CPU,%MEM" > cpu_test.csvpid=1 #Can be change by yourselfwhile true do top -bn1 -n 1 -p $pid | tail -1 | awk '{ print $9,$10 }' | sed 's/ /,/' >> cpu_test.csv sleep 2 #delay timedone 脚

shell脚本的简单制作与格式

一.shell脚本基础 1.第一个脚本 vim  first.sh 分别使用三种方法执行脚本:   ./first.sh  (需要有可执行的权限)   sh    first.sh   .   first.sh(或source  first.sh) 2.重定向与管道符 1)重定向输出(>) 2)重定向输出(>>追加) 3)重定向输入<</font> useradd  jerry vi   pass.txt (在里面输入123456,保存退出) 注明:将jerry用户的密

shell脚本之函数的定义及使用

函数Function的使用 定义函数 1) 函数名称() { ... ... } 2) function 函数名称 { ... ... } 调用函数 函数名称 也可以通过位置变量的方式给函数传递参数 例子: 编写脚本,实现目录管理功能,要求使用函数 #!/bin/bash # createDir() { read -p "Enter directory: " dir if [ -d $dir ]; then echo "目录$dir存在" else mkdir -p