开启批量自启jar包程序 (springboot)(crontab 和 rc.local运行java程序注意环境变量)

开启批量自启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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:在Linux系统中,/etc/rc.d/rc.local是一个脚本文件,用于在系统启动时自动执行一些命令或进程。它通常用于用户自定义的启动脚本。然而,有些Linux发行版可能没有这个文件。引用\[2\]:如果您的系统中没有/etc/rc.d/rc.local文件,您可以尝试其他方法来实现在系统启动时自动执行命令或进程。一种方法是使用/etc/profile.d/目录。您可以在该目录下创建一个脚本文件,并在其中添加您要启动的进程命令。另一种方法是使用crontab工具,通过编辑crontab文件来设置在系统启动时执行命令或进程。引用\[3\]:另外,您还可以手动控制服务的启动和停止。您可以使用/etc/init.d/目录中的启动脚本来启动、停止或重启服务。如果您想禁止某个服务在启动时自动运行,您可以将相应运行级别中的启动脚本链接由"S##xxx"重命名为"K##xxx"。 #### 引用[.reference_title] - *1* [linux中/etc/rc.d/目录和/etc/rc.d/rc.local文件的详解](https://blog.csdn.net/ymeng9527/article/details/102677254)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [linux程序设置开机自动启动/etc/rc.d/rc.local, /etc/profile.d/](https://blog.csdn.net/qq_38156743/article/details/130193984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [linux系统脚本启动顺序 /etc/rc.d/ 与/etc/rc.d/init.d](https://blog.csdn.net/u013921164/article/details/118176417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值