使用Java编写一个上传jar包到Linux服务器并启动的程序-程序员宅基地

技术标签: spring  java  linux  

上一家公司就有这样一种程序,但我没去看,只是觉得太厉害了,后面自己写自己的项目时发现每次打包项目上线都要打开xftp上传jar包,然后再打开xshell来停止上一个版本的jar包,然后运行刚上传的jar包,这样太麻烦了,要是有些小bug没有发现然后运行到服务器才陆陆续续的出现,就要做这种打包,上传,运行的操作太多了,于是我就想到了编写shell脚本来启动jar包,后面想起上一家公司的运行jar包的方式就索性做了个这样的程序,目前初始还算过得去,后面还会进行修饰

 1.先过一遍打包jar上传并运行的操作方法

         打包 package

         

      上传

         用xftp上传

      运行

      Linux命令:

               

cd /usr/local/java //打开到你存放jar的目录下
ps -ef|grep java //查看Java进程,如果之前有运行的就执行,没有就不用
//假如说有,那么会输出类似下面的结果
root      4590     1  2 Feb28 ?        15:29:13 java -jar -Xms64M -Xmx128M -XX:PermSize=64M -XX:MaxPermSize=128m -Dspring.profiles.active=pro bk_ht_center.jar
root     30177     1  2 19:56 ?        00:00:28 java -jar -Xms64M -Xmx128M -XX:PermSize=64M -XX:MaxPermSize=128m -Dspring.profiles.active=pro article.jar
//第二个结果为pid,即4590 30177
//假如我们要运行的是article.jar这个jar包,那么停止这个进程
kill -9 30177 //杀死这个进程,当然这种写法不好,但是简单快速暴力,不好就是他是啥都不管直接关闭的,假如程序还有些其他事在做的话它也会直接关闭它,这样会导致数据损失,但通常来讲,既然要重新运行jar包,想必是没有其他的数据要处理
//假如说这个jar包之前没有运行或者已经停止掉了,那么输入一下命令
nohup java -jar -Xms64M -Xmx128M -XX:PermSize=64M -XX:MaxPermSize=128m -Dspring.profiles.active=pro article.jar > article.out &

 nohup java -jar -Xms64M -Xmx128M -XX:PermSize=64M -XX:MaxPermSize=128m -Dspring.profiles.active=pro article.jar > > article.out & &

这段命令中 nohup 的作用是关闭会话不会停止Java进程,Java -jar是运行jar包, -Xms64M -Xmx128M -XX:PermSize=64M -XX:MaxPermSize=128m是指定jvm的一些内存大小,可以不写, -Dspring.profiles.active=pro是spring指定jar包运行时使用哪个配置文件的一个方式,> article.out & 是指定日志输出到> article.out 这个文件里面,最后一个&是引到下一个命令输入终端,省的占用命令窗口

2.使用shell脚本来运行jar包

摘抄网上以为老哥的方法:https://blog.csdn.net/bingxuesiyang/article/details/88531613

shell脚本编程可以看菜鸟:https://www.runoob.com/linux/linux-shell.html


#!/bin/bash
# 定义变量
# 要运行的jar包路径,加不加引号都行。 注意:等号两边 不能 有空格,否则会提示command找不到
JAR_NAME="/xxx/xxx/xxx/xxx.war"
# 日志路径,加不加引号都行。 注意:等号两边 不能 有空格,否则会提示command找不到
LOG_PATh=/export/Logs/main.log
 
 
# 如果输入格式不对,给出提示!
tips() {
	echo ""
	echo "WARNING!!!......Tips, please use command: sh auto_deploy.sh [start|stop|restart|status].   For example: sh auto_deploy.sh start  "
	echo ""
	exit 1
}
 
 
# 启动方法
start() {
        # 重新获取一下pid,因为其它操作如stop会导致pid的状态更新
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
        # -z 表示如果$pid为空时执行
	if [ -z $pid ]; then
        nohup java -jar $JAR_NAME > /dev/null 2>&1 &
        #{print $2}是输出结果第二个字段的值到pid中
        pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
		echo ""
        echo "Service ${JAR_NAME} is starting!pid=${pid}"
		echo "........................Here is the log.............................."
		echo "....................................................................."
        tail -f $LOG_PATh
		echo "........................Start successfully!........................."
	else
		echo ""
		echo "Service ${JAR_NAME} is already running,it's pid = ${pid}. If necessary, please use command: sh auto_deploy.sh restart."
		echo ""
	fi
}
 
# 停止方法
stop() {
		# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
        # -z 表示如果$pid为空时执行。 注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
	if [ -z $pid ]; then
		echo ""
        echo "Service ${JAR_NAME} is not running! It's not necessary to stop it!"
		echo ""
	else
		kill -9 $pid
		echo ""
		echo "Service stop successfully!pid:${pid} which has been killed forcibly!"
		echo ""
	fi
}
 
# 输出运行状态方法
status() {
        # 重新获取一下pid,因为其它操作如stop、restart、start等会导致pid的状态更新
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
        # -z 表示如果$pid为空时执行。注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
	if [ -z $pid ];then
		echo ""
        echo "Service ${JAR_NAME} is not running!"
		echo ""
	else
		echo ""
        echo "Service ${JAR_NAME} is running. It's pid=${pid}"
		echo ""
	fi
}
 
# 重启方法
restart() {
	echo ""
	echo ".............................Restarting.............................."
	echo "....................................................................."
		# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
        # -z 表示如果$pid为空时执行。 注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
	if [ ! -z $pid ]; then
		kill -9 $pid
	fi
	start
	echo "....................Restart successfully!..........................."
}
 
# 根据输入参数执行对应方法,不输入则执行tips提示方法
case "$1" in
   "start")
     start
     ;;
   "stop")
     stop
     ;;
   "status")
     status
     ;;
   "restart")
     restart
     ;;
   *)
     tips
     ;;
esac

 这个老哥写的很好,虽然初看有些头痛,但仔细看是很简单的,就跟写Java一样能理解

将这些内容输入到test.sh中,然后放到Linux系统

可以照这个老哥的方式创建shell脚本,也可以照我的方式

cd /usr/local/java

touch test.sh

vi tesh.sh

按 i 编辑

然后将内容复制进去

命令操作

启动: sh test.sh start

关闭: sh test.sh stop

查看状态: sh tesh.sh status

重启: sh tesh.sh restart

还可能会用到一些常用的文件操作命令

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43900374/article/details/115186018

智能推荐

GPLT练习集L1 1--8-程序员宅基地

文章浏览阅读370次。GPLT练习集L1 1--20L1-001 Hello World (5 分)题目描述代码L1-002 打印沙漏 (20 分)题目描述代码L1-003 个位数统计 (15 分)题目描述代码L1-004 计算摄氏温度 (5 分)题目描述代码L1-005 考试座位号 (15 分)题目描述代码L1-006 连续因子 (20 分)题目描述代码说明:L1-007 念数字 (10 分)题目描述代码L1-008 求整数段和 (10 分)题目描述代码L1-009 N个数求和 (20 分)题目描述代码优化前:优化后:L1-_gplt

epic无法登陆_【PC速报】利用Bug领取的看门狗2,Epic要回收了!科乐美要整活儿了!...-程序员宅基地

文章浏览阅读193次。《地平线:零之曙光》首月销量超70万套今日,Superdata发布了2020年8月全球发售的数字版游戏收入榜,报告指出《地平线:零之曙光》PC版首月销量为71.6万套,这一数字几乎和《巫师3:狂猎》持平,而且大大超过了《刺客信条:奥德赛》和《死亡搁浅》的首月销量。值得一提的是,《地平线:零之曙光》PC版于8月7日发售,登陆了Epic和Steam平台。《巫师3:狂猎》和《刺客信条:奥德赛》..._epic看门狗2打不开

php7.3默认pdo-mysql_在PHP中设置默认MySQL套接字,pdo_mysql.default_socket PHP 5.3-程序员宅基地

文章浏览阅读725次。我在设置MySQL的默认PDO套接字位置时遇到问题,而没有通过将PDO类初始化为变量来实现.我试过改变mysql.default_socket变量.但没有喜悦.目前唯一有效的方法是通过类DSN实例化.php.ini内容:[PHP]engine = Onzend.ze1_compatibility_mode = Offshort_open_tag = Onasp_tags = Offprecisio..._默认的php_mysql改成了pdo_mysql吗

vue项目刷新当前页面的方法_vue.prototype.navbarcolor 刷新-程序员宅基地

文章浏览阅读1.3k次。使用Vue-Router在进行路由配置时会带来的问题?1、重新进入当前路由,页面不进行刷新。2、在进行列表数据操作时:新增、删除、编辑时需要刷新当前页面。下面是解决方法方法一:强制刷新整个页面1、使用this.$router.go(0)函数,可以强制刷新当前页面2、使用window.location.href 或者window.location.reload 刷新当前页面这两种方法会..._vue.prototype.navbarcolor 刷新

margin 和 padding 分别适合什么场景使用?_什么时候用padding什么时候用margin-程序员宅基地

文章浏览阅读2.5k次,点赞4次,收藏17次。一、写在前面margin 和 padding 分别适合什么场景使用?_什么时候用padding什么时候用margin

LuckySheet css/js包资源本地化后图标无法使用的问题_in ./src/luckysheet/css/paint_24px.ico-程序员宅基地

文章浏览阅读1.4k次。本地导入:npm run build,将文件dist夹中的所有文件复制到项目目录中<link rel='stylesheet' href='./plugins/css/pluginsCss.css' /><link rel='stylesheet' href='./plugins/plugins.css' /><link rel='stylesheet' href='./css/luckysheet.css' /><link rel='style_in ./src/luckysheet/css/paint_24px.ico

随便推点

java高并发下实用场景解决思路_java高并发场景和实现-程序员宅基地

文章浏览阅读4k次。https://blog.csdn.net/cxl0921/article/details/58733178_java高并发场景和实现

使用表达式目录树实现SqlDataReader到实体的映射-程序员宅基地

文章浏览阅读240次。SqlDataReader映射实体,是ORM的基础功能,常见的实现方式有反射、表达式目录树和emit,这里要说的就是用表达式目录树生成实体的方法。先分析下思路:假设有个数据实体类,Studentpublic class Student{ public int Id { get; set; } public string Name { get; set; ..._c# 表达式树反射sqldatareader

修改nutch分页功能_nutch 抓取分页-程序员宅基地

文章浏览阅读1k次。发现nutch的分页功能做的实在是粗糙,最主要的是没有上一页,而且一出场默认显示两条记录来,再来个showAllhits,多余!这是个问题,今天早上花了一个小时再去修改它的分页。修改后的效果如下:当前处在第一页,显示后面的页数和下一页当前处在第二页,显示前面和后面的页数、上一页、下一页(我抓的是公司的网站,最常用的关键字也只有两页,囧)css自己调,简要说明下修改过程:1、去掉sh_nutch 抓取分页

【我的OpenGL学习进阶之旅】你好,三角形:一个OpenGL ES 3.0示例。 分别使用C++ Native & Java 两种方式来实现_eglesv3 glesv2 egl-程序员宅基地

文章浏览阅读4.6k次。为了介绍OpenGL ES 3.0的基本概念,我们从一个简单的示例开始。这个示例说明创建一个三角形的OpenGL ES 3.0程序所需要的步骤。一、OpenGL ES 3.0 示例效果:三角形效果如下所示:我们绘制一个红色的三角形。二、Native实现三角形2.0 准备步骤参考我之前的博客 【我的OpenGL学习进阶之旅】解决NDK使用OpenGL ES 3.0 的api报错:error: undefined reference to ‘glUnmapBuffer‘2.0.1 在Andro_eglesv3 glesv2 egl

Python基础语法 - 函数_python定义一个普通函数的语法结构-程序员宅基地

文章浏览阅读326次。Python基础语法 - 函数函数就是对实现某一特定功能的代码的封装。目的:将多段代码分块;实现一次编写代码,功能多次使用。1. 函数的分类函数就是实现某一特定功能的代码的封装。根据创造者对函数进行分类,分为两种:系统函数、自定义函数系统函数:由Python创建好的函数。例如:print、input、type、max、min、id等自定义函数:由程序员自己创建的函数2. 定义函数语法:def 函数名(形参列表): 函数说明文档 函数体 return 返回值_python定义一个普通函数的语法结构

Arduino的模拟输出-analogWrite()-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏7次。analogWrite()Description 介绍Writes an analog value (PWM wave) to a pin. Can be used to light a LED at varying brightnesses or drive a motor at various speeds. After a call toanalogWrite(), the ..._auduino的analongwrite