开启批量自启jar包程序
脚本:
#!/bin/sh
#echo `date +%F-%T` > /test.txt
export JAVA_HOME=/opt/Java/jdk1.8.0_65
export JRE_HOME=${JAVA_HOME}/jre
#要加环境变量 并且让其生效!!! 原先是没有开头这几句的环境变量的。
source /etc/profile
# 端口号
PORTS=(8848 9999 3000 4000 18001 18002 18003 18005 18007 18008 18012 18020 6666)
# 模块
MODULES=(okay-register okay-gateway okay-auth okay-upms-biz cdnaturemms-portal cdnaturemms-dr cdnaturemms-cp cdnaturemms-subsys ticket-pc ticket-mobile ticket-web guide-pc bsp-pay-platform)
# 模块名称
MODULE_NAMES=(注册中心 网关 AUTH UPMS cdnaturemms-portal cdnaturemms-dr cdnaturemms-cp cdnaturemms-subsys ticket-pc ticket-mobile ticket-web guide-pc bsp-pay-platform)
# jar包数组
JARS=(okay-register.jar okay-gateway.jar okay-auth.jar okay-upms-biz.jar cdnaturemms-portal.jar cdnaturemms-dr.jar cdnaturemms-cp.jar cdnaturemms-subsys.jar ticket-pc.jar ticket-mobile.jar ticket-web.jar guide-pc.jar bsp-pay-platform.jar)
# jar包路径
JAR_PATH='/opt/Applications/api'
# 日志路径
LOG_PATH='/opt/Applications/api/logs'
start() {
local MODULE=
local MODULE_NAME=
local JAR_NAME=
local command="$1"
local commandOk=0
local count=0
local okCount=0
local port=0
for((i=0;i<${#MODULES[@]};i++))
do
MODULE=${MODULES[$i]}
MODULE_NAME=${MODULE_NAMES[$i]}
JAR_NAME=${JARS[$i]}
PORT=${PORTS[$i]}
if [ "$command" == "all" ] || [ "$command" == "$MODULE" ];then
commandOk=1
count=0
PID=`pgrep -f "$JAR_NAME"`
#PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
if [ -n "$PID" ];then
echo "$MODULE---$MODULE_NAME:已经运行,PID=$PID"
else
exec nohup java -Xms256m -Xmx512m -jar $JAR_PATH/$JAR_NAME >> $LOG_PATH/$MODULE.log 2>&1 &
sleep 25s
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
while [ -z "$PID" ]
do
if (($count == 30));then
echo "$MODULE---$MODULE_NAME:$(expr $count \* 25)秒内未启动,请检查!"
break
fi
count=$(($count+1))
echo "$MODULE_NAME启动中.................."
sleep 25s
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
done
okCount=$(($okCount+1))
echo "$MODULE---$MODULE_NAME:已经启动成功,PID=$PID"
fi
fi
done
if(($commandOk == 0));then
echo "第二个参数输入错误"
else
echo "............本次共启动:$okCount个服务..........."
fi
}
stop() {
local MODULE=
local MODULE_NAME=
local JAR_NAME=
local command="$1"
local commandOk=0
local okCount=0
for((i=0;i<${#MODULES[@]};i++))
do
MODULE=${MODULES[$i]}
MODULE_NAME=${MODULE_NAMES[$i]}
JAR_NAME=${JARS[$i]}
if [ "$command" = "all" ] || [ "$command" = "$MODULE" ];then
commandOk=1
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
if [ -n "$PID" ];then
echo "$MODULE---$MODULE_NAME:准备结束,PID=$PID"
kill -9 $PID
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
while [ -n "$PID" ]
do
sleep 3s
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
done
echo "$MODULE---$MODULE_NAME:成功结束"
okCount=$(($okCount+1))
else
echo "$MODULE---$MODULE_NAME:未运行"
fi
fi
done
if (($commandOk == 0));then
echo "第二个参数输入错误"
else
echo "............本次共停止:$okCount个服务............"
fi
}
case "$1" in
start)
start "$2"
;;
stop)
stop "$2"
;;
restart)
stop "$2"
sleep 3s
start "$2"
;;
*)
echo "第一个参数请输入:start|stop|restart"
exit 1
;;
esac
对应的jar包:
[root@OkayGis-20139 api]# ls
bjmms-cp-18003.out bsp-pay-platform-6666.out cdnaturemms-portal-18001.out hs_err_pid28087.log okay-gateway-9999.out okay-upms-biz.jar ticket-pc.jar
bjmms-cp.jar bsp-pay-platform.jar cdnaturemms-portal.jar logs okay-gateway.jar StartapiJar.sh ticket-web.jar
bjmms-dr-18002.out cdnaturemms-cp-18003.out cdnaturemms-subsys-18005.out oa-web-18004.out okay-register-8848.out StartapiJar.sh.bak
bjmms-dr.jar cdnaturemms-cp.jar cdnaturemms-subsys.jar oa-web.jar okay-register.jar ticket-mobile-18008.out
bjmms-portal-18001.out cdnaturemms-dr-18002.out guide-pc-18020.out okay-auth-3000.out okay-upms-4000.out ticket-mobile.jar
bjmms-portal.jar cdnaturemms-dr.jar guide-pc.jar okay-auth.jar okay-upms-biz-111.jar ticket-pc-18007.out
[root@OkayGis-20139 api]# pwd
/opt/Applications/api
对应的log文件:
[root@OkayGis-20139 logs]# ls
bjmms-cp bsp-pay-platform.out cdnaturemms-dr.log cdnaturemms-subsys guide-pc.log okay-gateway.log ticket-mobile ticket-pc.out
bjmms-dr cdnaturemms-cp cdnaturemms-dr.out cdnaturemms-subsys.log guide-pc.out okay-register.log ticket-mobile.log ticket-web
bjmms-portal cdnaturemms-cp.log cdnaturemms-portal cdnaturemms-subsys.out oa-web okay-register.out ticket-mobile.out ticket-web.log
bsp-pay-platform cdnaturemms-cp.out cdnaturemms-portal.log dyms-dr-18002.out okay-auth okay-upms-biz ticket-pc ticket-web.out
bsp-pay-platform.log cdnaturemms-dr cdnaturemms-portal.out guide-pc okay-auth.log okay-upms-biz.log ticket-pc.log work
corntab -l
[root@OkayGis-20139 api]# crontab -l
@reboot /opt/Applications/api/StartapiJar.sh start all >>/opt/2021-1812nohup.out 2>&1
遇到的坑:(crontab 和 rc.local运行java程序注意环境变量!)
开始讲故事 / 排错过程 :
手动运行StartapiJar.sh 脚本是正常的。 sh StartapiJar.sh start all
但是将脚本放到 rc.local 和 crontab后,运行结果异常,一直卡在“注册中心启动中”
开set -x 排错。 看样子是没获取到PID ,导致一直循环,在外面 ps -ef | grep java结果是空的。那估计问题出在java -jar xxx.jar上。
开始还以为是给的sleep秒数太少。
查看jar包生成的日志:发现这个错误:nohup: failed to run command ‘java’ no such file or directory
cat okay-register.log
马龙帅的指导 pgrep :
pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。
#这样上面的PID获取就不用写一长串的东西了。
pgrep -f "$JAR_NAME"
参考:
https://www.cnblogs.com/zhucezmf/p/10459081.html
https://blog.csdn.net/Nightwish5/article/details/117066081
https://blog.csdn.net/weixin_38169722/article/details/101771446