作者: | 来源:互联网 | 2023-06-08 12:12
开启批量自启jar包程序
脚本:
#!/bin/sh
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)
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_PATH='/opt/Applications/api'
LOG_PATH='/opt/Applications/api/logs'
start() {local MODULE&#61;local MODULE_NAME&#61;local JAR_NAME&#61;local command&#61;"$1"local commandOk&#61;0local count&#61;0local okCount&#61;0local port&#61;0for((i&#61;0;i<${#MODULES[&#64;]};i&#43;&#43;))doMODULE&#61;${MODULES[$i]}MODULE_NAME&#61;${MODULE_NAMES[$i]}JAR_NAME&#61;${JARS[$i]}PORT&#61;${PORTS[$i]}if [ "$command" &#61;&#61; "all" ] || [ "$command" &#61;&#61; "$MODULE" ];thencommandOk&#61;1count&#61;0PID&#61;&#96;pgrep -f "$JAR_NAME"&#96;if [ -n "$PID" ];thenecho "$MODULE---$MODULE_NAME:已经运行,PID&#61;$PID"elseexec nohup java -Xms256m -Xmx512m -jar $JAR_PATH/$JAR_NAME >> $LOG_PATH/$MODULE.log 2>&1 &sleep 25sPID&#61;&#96;ps -ef |grep $(echo $JAR_NAME | awk -F/ &#39;{print $NF}&#39;) | grep -v grep | awk &#39;{print $2}&#39;&#96;while [ -z "$PID" ]doif (($count &#61;&#61; 30));thenecho "$MODULE---$MODULE_NAME:$(expr $count \* 25)秒内未启动,请检查!"breakficount&#61;$(($count&#43;1))echo "$MODULE_NAME启动中.................."sleep 25sPID&#61;&#96;ps -ef |grep $(echo $JAR_NAME | awk -F/ &#39;{print $NF}&#39;) | grep -v grep | awk &#39;{print $2}&#39;&#96;doneokCount&#61;$(($okCount&#43;1))echo "$MODULE---$MODULE_NAME:已经启动成功,PID&#61;$PID"fifidoneif(($commandOk &#61;&#61; 0));thenecho "第二个参数输入错误"elseecho "............本次共启动:$okCount个服务..........."fi
}stop() {local MODULE&#61;local MODULE_NAME&#61;local JAR_NAME&#61;local command&#61;"$1"local commandOk&#61;0local okCount&#61;0for((i&#61;0;i<${#MODULES[&#64;]};i&#43;&#43;))doMODULE&#61;${MODULES[$i]}MODULE_NAME&#61;${MODULE_NAMES[$i]}JAR_NAME&#61;${JARS[$i]}if [ "$command" &#61; "all" ] || [ "$command" &#61; "$MODULE" ];thencommandOk&#61;1PID&#61;&#96;ps -ef |grep $(echo $JAR_NAME | awk -F/ &#39;{print $NF}&#39;) | grep -v grep | awk &#39;{print $2}&#39;&#96;if [ -n "$PID" ];thenecho "$MODULE---$MODULE_NAME:准备结束,PID&#61;$PID"kill -9 $PIDPID&#61;&#96;ps -ef |grep $(echo $JAR_NAME | awk -F/ &#39;{print $NF}&#39;) | grep -v grep | awk &#39;{print $2}&#39;&#96;while [ -n "$PID" ]dosleep 3sPID&#61;&#96;ps -ef |grep $(echo $JAR_NAME | awk -F/ &#39;{print $NF}&#39;) | grep -v grep | awk &#39;{print $2}&#39;&#96;doneecho "$MODULE---$MODULE_NAME:成功结束"okCount&#61;$(($okCount&#43;1))elseecho "$MODULE---$MODULE_NAME:未运行"fifidoneif (($commandOk &#61;&#61; 0));thenecho "第二个参数输入错误"elseecho "............本次共停止:$okCount个服务............"fi
}case "$1" instart)start "$2";;stop)stop "$2";;restart)stop "$2"sleep 3sstart "$2";;*)echo "第一个参数请输入:start|stop|restart"exit 1;;
esac
对应的jar包:
[root&#64;OkayGis-20139 api]
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&#64;OkayGis-20139 api]
/opt/Applications/api
对应的log文件&#xff1a;
[root&#64;OkayGis-20139 logs]
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&#64;OkayGis-20139 api]
&#64;reboot /opt/Applications/api/StartapiJar.sh start all >>/opt/2021-1812nohup.out 2>&1
遇到的坑&#xff1a;&#xff08;crontab 和 rc.local运行java程序注意环境变量&#xff01;&#xff09;
开始讲故事 / 排错过程 &#xff1a;
手动运行StartapiJar.sh 脚本是正常的。 sh StartapiJar.sh start all
但是将脚本放到 rc.local 和 crontab后&#xff0c;运行结果异常&#xff0c;一直卡在“注册中心启动中”
开set -x 排错。 看样子是没获取到PID &#xff0c;导致一直循环&#xff0c;在外面 ps -ef | grep java结果是空的。那估计问题出在java -jar xxx.jar上。
开始还以为是给的sleep秒数太少。
查看jar包生成的日志&#xff1a;发现这个错误&#xff1a;nohup: failed to run command ‘java’ no such file or directory
cat okay-register.log
马龙帅的指导 pgrep &#xff1a;
pgrep命令以名称为依据从运行进程队列中查找进程&#xff0c;并显示查找到的进程id。每一个进程ID以一个十进制数表示&#xff0c;通过一个分割字符串和下一个ID分开&#xff0c;默认的分割字符串是一个新行。对于每个属性选项&#xff0c;用户可以在命令行上指定一个以逗号分割的可能值的集合。
pgrep -f "$JAR_NAME"
参考&#xff1a;
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