无忧启动论坛

标题: linux下优雅启动停止java jar格式项目的脚本 [打印本页]

作者: ldg_2    时间: 2024-8-1 09:29
标题: linux下优雅启动停止java jar格式项目的脚本
linux下运行java的jar文件(尤其是springboot生成的一体化jar包)一般命令行为:
  1. nohup java -jar your-application.jar &
复制代码
这里的 your-application.jar 应该替换为您想要运行的 JAR 文件的实际文件名。
如果您还想要指定输出文件,可以使用 > 或 >> 将输出重定向到文件中,例如:

  1. nohup java -jar your-application.jar > output.log &
复制代码
这将会把标准输出重定向到 output.log 文件,并且即使您关闭终端或者注销用户,Java 应用程序也会继续运行。

停止的话需要
  1. ps -ef | grep 进程名
复制代码
取得进程号,然后kill杀掉。程序员都是些很懒的家伙,所以就有了以下的脚本,用来把这种工作自动化,美其名曰优雅。
  1. #!/bin/bash
  2. cd `dirname $0`
  3. CUR_SHELL_DIR=`pwd`
  4. CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
  5. #修改这里jar包名即可 demo-0.0.1-SNAPSHOT.jar
  6. #JAR_NAME="xxxxxxxxxxxx.jar"
  7. JAR_NAME="ty-listen-0.0.1-SNAPSHOT.jar"
  8. JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME
  9. #JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m"
  10. JAVA_MEM_OPTS=""
  11. #SPRING_PROFILES_ACTIV="-Dspring.profiles.active=eureka2"
  12. SPRING_PROFILES_ACTIV=""
  13. LOG_DIR=$CUR_SHELL_DIR/logs
  14. LOG_PATH=$LOG_DIR/${JAR_NAME}.log
  15. echo_help()
  16. {
  17.     echo -e "syntax: sh $CUR_SHELL_NAME start|stop"
  18. }
  19. if [ -z $1 ];then
  20.     echo_help
  21.     exit 1
  22. fi
  23. if [ ! -d "$LOG_DIR" ];then
  24.     mkdir "$LOG_DIR"
  25. fi
  26. if [ ! -f "$LOG_PATH" ];then
  27.     touch "$LOG_DIR"
  28. fi
  29. if [ "$1" == "start" ];then
  30. # check server
  31.     PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
  32.     if [ -n "$PIDS" ]; then
  33.         echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}."
  34.         exit 1
  35.     fi
  36. echo "Starting the $JAR_NAME..."

  37.     # start
  38.     nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 &

  39.     COUNT=0
  40.     while [ $COUNT -lt 1 ]; do
  41.         sleep 1
  42.         COUNT=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l`
  43.         if [ $COUNT -gt 0 ]; then
  44.             break
  45.         fi
  46.     done
  47.     PIDS=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'`
  48.     echo "${JAR_NAME} Started and the PID is ${PIDS}."
  49.     echo "You can check the log file in ${LOG_PATH} for details."

  50. elif [ "$1" == "stop" ];then

  51.     PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
  52.     if [ -z "$PIDS" ]; then
  53.         echo "ERROR:The $JAR_NAME does not started!"
  54.         exit 1
  55.     fi
  56. echo -e "Stopping the $JAR_NAME..."

  57.     for PID in $PIDS; do
  58.         kill $PID > /dev/null 2>&1
  59.     done

  60.     COUNT=0
  61.     while [ $COUNT -lt 1 ]; do
  62.         sleep 1
  63.         COUNT=1
  64.         for PID in $PIDS ; do
  65.             PID_EXIST=`ps --no-heading -p $PID`
  66.             if [ -n "$PID_EXIST" ]; then
  67.                 COUNT=0
  68.                 break
  69.             fi
  70.         done
  71.     done

  72.     echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}."
  73. else
  74.     echo_help
  75.     exit 1
  76. fi
复制代码
代码有注释,就不详细描述,熟悉shell脚本或者java程序员看看试试就明白了。

当然你还可以进一步修改,更符合你的使用习惯。

可能碰到的问题:如果是在windows下编辑,上传到linux下运行脚本,可能会报错:
  1. [root@localhost test]# ./test.sh  
  2. -bash: ./test.sh: /bin/sh^M: bad interpreter: No such file or directory
复制代码
原因是sh脚本文件的格式在windows和linux下不同,解决办法:
用vi打开脚本文件,在vi命令模式中使用 :set ff 命令
  1. 命令::set ff=unix
  2. 或者::set fileformat=unix
复制代码
:wq保存退出就可以了

说明:之前网上有人发表过,现在找不到出处和作者了,这里贴出来,给有需要的坛友。




作者: yyz2191958    时间: 2024-8-1 09:36
谢谢分享
作者: wn168cn@163.com    时间: 2024-8-1 10:04
谢谢分享
作者: zqfeng01    时间: 2024-8-1 10:08
谢谢分享
作者: zqfeng01    时间: 2024-8-1 10:08

谢谢分享
作者: 13325531750    时间: 2024-8-1 10:45
感谢分享!
作者: louther    时间: 2024-8-1 11:01
感谢分享!
作者: xiaoxinTAT    时间: 2024-8-1 11:24
感谢分享!!
作者: yyz2191958    时间: 2024-8-1 11:59
进来学习
作者: towlzj800801    时间: 2024-8-1 12:13
多谢楼主分享!
作者: ootd123    时间: 2024-8-1 13:04
谢谢分享
作者: guong    时间: 2024-8-1 13:30

感谢分享!
作者: yc2428    时间: 2024-8-1 14:21
谢谢分享...
作者: 737708260    时间: 2024-8-1 16:13
感谢分享!学习中》》》》》
作者: wang1126    时间: 2024-8-1 17:25
谢谢分享
作者: dshit    时间: 2024-8-1 17:28
属实优雅。一般我结束进程 先ps 找到程序,在kill 就好了。
作者: 2012fengxi    时间: 2024-8-1 22:58
感谢分享!
作者: towlzj800801    时间: 2024-8-1 23:53
多谢楼主分享!
作者: cqh    时间: 2024-11-13 07:49
学习




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3