zoukankan      html  css  js  c++  java
  • 钻牛角尖还是走进死胡同--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
  • 相关阅读:
    mysql 设置自增主键id的起始值
    一文搞定MySQL的事务和隔离级别
    SpringBoot2.0整合Redis
    Redis Cluster搭建高可用Redis服务器集群
    为什么单线程的Redis这么快?
    Spring Boot使用AOP在控制台打印请求、响应信息
    Spring boot集成spring session实现session共享
    SpringBoot项目在IntelliJ IDEA中实现热部署
    Spring Boot入门-快速搭建web项目
    一篇文章搞定SpringMVC参数绑定
  • 原文地址:https://www.cnblogs.com/luodengxiong/p/6165838.html
Copyright © 2011-2022 走看看