钻牛角尖还是走进死胡同--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
原文地址:https://www.cnblogs.com/luodengxiong/p/6165838.html