到了下午,突然觉得坐立不安,可能是因为中午没有休息好。老大不小了还在做页面整合的事情,这是参加工作时就干的工作了。然后突然想去挑战高级一点的缺陷排查,结果一不小心就钻了一个牛角尖。启动 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