上一家公司就有这样一种程序,但我没去看,只是觉得太厉害了,后面自己写自己的项目时发现每次打包项目上线都要打开xftp上传jar包,然后再打开xshell来停止上一个版本的jar包,然后运行刚上传的jar包,这样太麻烦了,要是有些小bug没有发现然后运行到服务器才陆陆续续的出现,就要做这种打包,上传,运行的操作太多了,于是我就想到了编写shell脚本来启动jar包,后面想起上一家公司的运行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 这个文件里面,最后一个&是引到下一个命令输入终端,省的占用命令窗口
摘抄网上以为老哥的方法: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
还可能会用到一些常用的文件操作命令
文章浏览阅读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
文章浏览阅读193次。《地平线:零之曙光》首月销量超70万套今日,Superdata发布了2020年8月全球发售的数字版游戏收入榜,报告指出《地平线:零之曙光》PC版首月销量为71.6万套,这一数字几乎和《巫师3:狂猎》持平,而且大大超过了《刺客信条:奥德赛》和《死亡搁浅》的首月销量。值得一提的是,《地平线:零之曙光》PC版于8月7日发售,登陆了Epic和Steam平台。《巫师3:狂猎》和《刺客信条:奥德赛》..._epic看门狗2打不开
文章浏览阅读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吗
文章浏览阅读1.3k次。使用Vue-Router在进行路由配置时会带来的问题?1、重新进入当前路由,页面不进行刷新。2、在进行列表数据操作时:新增、删除、编辑时需要刷新当前页面。下面是解决方法方法一:强制刷新整个页面1、使用this.$router.go(0)函数,可以强制刷新当前页面2、使用window.location.href 或者window.location.reload 刷新当前页面这两种方法会..._vue.prototype.navbarcolor 刷新
文章浏览阅读2.5k次,点赞4次,收藏17次。一、写在前面margin 和 padding 分别适合什么场景使用?_什么时候用padding什么时候用margin
文章浏览阅读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
文章浏览阅读4k次。https://blog.csdn.net/cxl0921/article/details/58733178_java高并发场景和实现
文章浏览阅读240次。SqlDataReader映射实体,是ORM的基础功能,常见的实现方式有反射、表达式目录树和emit,这里要说的就是用表达式目录树生成实体的方法。先分析下思路:假设有个数据实体类,Studentpublic class Student{ public int Id { get; set; } public string Name { get; set; ..._c# 表达式树反射sqldatareader
文章浏览阅读1k次。发现nutch的分页功能做的实在是粗糙,最主要的是没有上一页,而且一出场默认显示两条记录来,再来个showAllhits,多余!这是个问题,今天早上花了一个小时再去修改它的分页。修改后的效果如下:当前处在第一页,显示后面的页数和下一页当前处在第二页,显示前面和后面的页数、上一页、下一页(我抓的是公司的网站,最常用的关键字也只有两页,囧)css自己调,简要说明下修改过程:1、去掉sh_nutch 抓取分页
文章浏览阅读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
文章浏览阅读326次。Python基础语法 - 函数函数就是对实现某一特定功能的代码的封装。目的:将多段代码分块;实现一次编写代码,功能多次使用。1. 函数的分类函数就是实现某一特定功能的代码的封装。根据创造者对函数进行分类,分为两种:系统函数、自定义函数系统函数:由Python创建好的函数。例如:print、input、type、max、min、id等自定义函数:由程序员自己创建的函数2. 定义函数语法:def 函数名(形参列表): 函数说明文档 函数体 return 返回值_python定义一个普通函数的语法结构
文章浏览阅读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