无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 1211|回复: 18
打印 上一主题 下一主题

[分享] linux下优雅启动停止java jar格式项目的脚本

[复制链接]
跳转到指定楼层
1#
发表于 2024-8-1 09:29:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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保存退出就可以了

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



点评

辛苦了  发表于 2024-8-1 09:37

评分

参与人数 1无忧币 +2 收起 理由
yyz2191958 + 2 赞一个!

查看全部评分

2#
发表于 2024-8-1 09:36:43 | 只看该作者
谢谢分享
回复

使用道具 举报

3#
发表于 2024-8-1 10:04:32 | 只看该作者
谢谢分享
回复

使用道具 举报

4#
发表于 2024-8-1 10:08:04 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
发表于 2024-8-1 10:08:18 | 只看该作者

谢谢分享
回复

使用道具 举报

6#
发表于 2024-8-1 10:45:01 | 只看该作者
感谢分享!
回复

使用道具 举报

7#
发表于 2024-8-1 11:01:09 | 只看该作者
感谢分享!
回复

使用道具 举报

8#
发表于 2024-8-1 11:24:59 | 只看该作者
感谢分享!!
回复

使用道具 举报

9#
发表于 2024-8-1 11:59:11 | 只看该作者
进来学习
回复

使用道具 举报

10#
发表于 2024-8-1 12:13:53 | 只看该作者
多谢楼主分享!
回复

使用道具 举报

11#
发表于 2024-8-1 13:04:26 | 只看该作者
谢谢分享
回复

使用道具 举报

12#
发表于 2024-8-1 13:30:49 | 只看该作者

感谢分享!
回复

使用道具 举报

13#
发表于 2024-8-1 14:21:32 | 只看该作者
谢谢分享...
回复

使用道具 举报

14#
发表于 2024-8-1 16:13:31 | 只看该作者
感谢分享!学习中》》》》》
回复

使用道具 举报

15#
发表于 2024-8-1 17:25:38 | 只看该作者
谢谢分享
回复

使用道具 举报

16#
发表于 2024-8-1 17:28:38 | 只看该作者
属实优雅。一般我结束进程 先ps 找到程序,在kill 就好了。
回复

使用道具 举报

17#
发表于 2024-8-1 22:58:08 | 只看该作者
感谢分享!
回复

使用道具 举报

18#
发表于 2024-8-1 23:53:59 | 只看该作者
多谢楼主分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-9-22 11:41

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表