spug上线服务踩坑记
spug是一款优秀的自动化运维平台, 这让我们想自动化又向前迈了一步.
在过程中遇到的问题,记录在这里供各位看官参考.
目录
一、远程执行命令问题
二、软连接的问题
三、jdk 版本问题
四、ssh远程连接中传递变量
五、解决spug 上版卡一直卡主的问题
六、新建应用踩坑记
一、远程执行命令问题
利用spug打好包之后,如何分发到应用最终跑的那台主机上去。
这里有三个想法:
1、ssh 发布主机后 执行命令,
例如:
ssh 10.50 "ln -snf /opt/qwert-$SPUG_GIT_TAG.war /opt/eqwe_fi_-spug.war"
对于内置命令不需要写命令的绝对路径,
ssh 10.50 "setsid /usr/lcal/jdk1.8.0_121/bin/java -Xms512m -Xmx1024m ....
对非内置命令需要写绝对路径,这是为何? 这是和 环境变量有关的
2、ssh之后去执行命令
在spug 常规发布中,在目标主机上ssh 发布主机,ssh IP "ls /opt" 这个可以执行出来 。但是 先ssh IP 再执行其他命令就不行
这是在非登录SHELL里执行的。
尝试使用ssh -tt 强制分配一个tty也不行
3、EOT End Of Text.
看下面这个例子,登录到目标主机上去,执行完命令后退出,使用这种方式在需要发布的主机上把打好的包copy过去,然后开始启动流程
ssh user@server /bin/bash <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
这段shell 写的不是很好,硬编码严重,逻辑也有不严谨的地方。后续持续改进
echo "开始修改包名..............:"mv /opt/MPP/target/MPP.jar /opt/MPP/target/MPP_array_fi_$SPUG_GIT_TAG.jar
echo "修改中..............:"
sleep 1s
if [ $? -eq 0 ]
then
echo "修改成功.............."
else
echo "修改失败,请确认.............."
fiecho "开始移动包到指定服务器..............:"
#todo 2021年7月6日10:03:21 自动免密验证
# ssh 192.168.10.168 /bin/bash << 'EOT'# if [ -d /opt/servers/MPP4 ];then
# echo "目录已存在"
# else
# mkdir -p /opt/servers/MPP4/
# echo "目录创建成功"
# fi
# EOTscp /opt/MPP/target/MPP_array_fi_$SPUG_GIT_TAG.jar 192.168.10.168:/opt/servers/MPP4ssh 192.168.10.168 "ln -snf /opt/servers/MPP4/MPP_array_fi_$SPUG_GIT_TAG.jar /opt/servers/MPP4/MPP-spug.jar"# --------------------------------------------- ssh by sscripts start 2021年7月27日09:01:05
ssh root@192.168.10.168 /bin/bash <<'EOT'cd /opt/servers/MPP4/echo "当前目录为:"
pwdPID=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}')PID_CNT=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}'|wc -l)if [ $PID_CNT -eq 1 ];then
echo "进程已存在,pid: $PID..............:"
echo "重启中..............:"
ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}'|xargs kill -9
sleep 10s
date +%H:%M:%S
PID_CNT1=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}'|wc -l)if [ $PID_CNT1 -eq 0 ];thenecho "......启动命令$$........:"setsid /usr/local/jdk1.8.0_191/bin/java -Djava.rmi.server.hostname=192.168.10.168 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms1024m -Xmx4096m -jar -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/aplog/MPP/agc.log -Dspring.profiles.active=prod /opt/servers/MPP4/MPP-spug.jar --server.port=8066 --mq.quartzFlg=Y --etl.quartzFlg=N --mq.alarmQuartzFlg=N --mq.shopId=QQQ >/dev/null &PID1=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}')echo "重启成功,pid: $PID1..............:"fi
else
date +%H:%M:%S
echo "当前目录为:"
pwd
echo "启动中..............:"
date +%H:%M:%Ssetsid /usr/local/jdk1.8.0_191/bin/java -Djava.rmi.server.hostname=192.168.10.168 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms1024m -Xmx4096m -jar -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/aplog/MPP/agc.log -Dspring.profiles.active=prod /opt/servers/MPP4/MPP-spug.jar --server.port=8066 --mq.quartzFlg=Y --etl.quartzFlg=N --mq.alarmQuartzFlg=N --mq.shopId=QQQ >/dev/null &
PID2=$(ps -ef|egrep "MPP"|grep -v egrep|awk '{print $2}')
date +%H:%M:%S
echo "启动成功,PID为 $PID2..............:"
fi
EOT
date +%H:%M:%S
二、软连接的问题
进入一个软连接目录,如果该目录被重新指向新的链接。
此时在当前目录看到的文件仍旧是旧文件.
cd出去,重新进入该目录文件才更新.
参考:
linux - Pseudo-terminal will not be allocated because stdin is not a terminal - Stack Overflow
三、jdk 版本问题
启动java程序时报如下错误
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/navi/RtmApplication : Unsupported major.minor version 52.0at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:803)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)at java.net.URLClassLoader.access$100(URLClassLoader.java:71)at java.net.URLClassLoader$1.run(URLClassLoader.java:361)at java.net.URLClassLoader$1.run(URLClassLoader.java:355)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:354)at java.lang.ClassLoader.loadClass(ClassLoader.java:425)at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:94)at java.lang.ClassLoader.loadClass(ClassLoader.java:358)at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
打包机器的的JDK版本和AP服务器的JDK版本不一致导致的
打包环境: /usr/local/jdk1.8.0_144/bin/java
运行环境: /usr/local/jdk1.8.0_191/bin/java
打包环境jdk版本是向下兼容,如果运行环境的版本比打包的新则会报如上错误.
解决: 使用同一个jdk版本打包
--update 2022年8月10日09:57:40
今天在执行脚本模板的时候也同样报这个错误, 这仅仅是远程执行脚本 为何会对jdk版本有要求呢?
其实是因为启动脚本中没有使用java的绝对路径导致的。
参考: JAVA版本号的问题 Java版本号与JDK版本_renhq-CSDN博客_jdk与java版本
四、ssh远程连接中传递变量
问题:
解决:
注意双引号才会有变量替换,再复习下shell的解析
五、解决spug 上版卡一直卡主的问题
上版的时候一直卡在检出后发布
这是在检出前打印配置信息
解决:
仔细观察发现打印配置文件卡主的地方是第一次出现中文注释的地方。
可以在cat 的时候直接转码
echo "当前配置列表 ......"
# iconv -f GBK -t UTF-8 用于转换中文乱码问题
cat ./chot-configs/src/main/resources/application-production.properties | iconv -f GBK -t UTF-8
echo "done"
iconv命令 是用来转换文件的编码方式的,比如它可以将UTF8编码的转换成GB18030的编码,反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数,可以用来在C/C++程序中很方便的转换字符编码,这在抓取网页的程序中很有用处,而iconv命令在调试此类程序时用得着。-f encoding :把字符从encoding编码开始转换。
-t encoding :把字符转换到encoding编码。
列出当前支持的字符编码: iconv -l
将文件file1转码,转后文件输出到fil2中: iconv file1 -f EUC-JP-MS -t UTF-8 -o file2
这里,没-o那么会输出到标准输出。
六、新建应用踩坑记
模板已经算很完善了,为啥还会报错呢?发现是新建的应用中有一个空格,导致后面的命令执行失败。linux中对于名称这类的建议不要使用空格。如果非要用,那引用的时候需要加上引号。这个win是完全不同的
spug上线服务踩坑记相关推荐
- 微服务踩坑记之Zuul注册到Eureka
问题如下: Request execution error com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectExce ...
- go nil json.marshal 完是null_字节跳动踩坑记#3:Go服务灵异panic
这个坑比较新鲜,刚填完,还冒着冷气. - 1 - 在字节跳动,我们服务的所有 log 都通过统一的日志库采集到流式日志服务.落地 ES 集群,配上字节云超(sang)级(xin)强(bing)大(ku ...
- Spring @Transactional踩坑记
@Transactional踩坑记 总述 Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...
- Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记
前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...
- python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django
<>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...
- 服务器重新部署踩坑记
服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...
- IdentityServer 部署踩坑记
IdentityServer 部署踩坑记 Intro 周末终于部署了 IdentityServer 以及 IdentityServerAdmin 项目,踩了几个坑,在此记录分享一下. 部署架构 项目是 ...
- windows container 踩坑记
windows container 踩坑记 Intro 我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署 ...
- Typora+PicGo-core+SMMS图床踩坑记
Typora+PicGo-core+SMMS图床踩坑记 一.安装PicGo-Core 二.安装smms v2 API插件 三.配置PicGo-Core 四.最终效果 五.总结 最近把Typora更新后 ...
最新文章
- 大盘过4000,注意风险~
- 获取一个目录下文件扩展名为txt或htm或html的文件的几种方法
- Java wait forever_彻底搞清楚Java并发 (一) 基础
- 2011年5月19日盘后分析:把握行情运行主线 静待大盘明确信号
- GIT项目管理工具(part6)--放弃工作区文件修改及从仓库区恢复文件
- 命令行的形式运行php
- 如何查看 mysql 的视图?
- redis 中一个字段 修改map_Redis 几种数据类型及应用场景
- 服务器查看文件共享记录,服务器共享文件记录
- aloha协议c语言实现,任务ALOHA协议的OPNET仿真.doc
- 幽灵蛛(pholcus)规则(二)
- python使用ffmpeg合并两个MP4视频
- 电脑广告弹窗如何操作过滤屏蔽,经验技巧!怎样设置弹窗自动拦截?
- steam无法连接至计算机,大神传授win7系统游戏无法连接至steam网络一直卡在“正在连接steam”界面的设置技巧...
- 我的世界rpg服务器背包位置,我的世界查看玩家背包方法 如何查看玩家背包
- 电流感应放大器应用技术要点
- C语言(##)连接符号的简单使用
- phpstorm文件的大纲里的m、f、fx是什么意思?
- 计算机毕业设计java+jsp鲜花销售商城信息网站(源码+系统+mysql数据库+Lw文档)
- 【世界上最好用的编程语言】PHP基础入门详解
热门文章
- PHP 对接美团大众点评团购券的开发步骤
- GPS卫星运动及定位matlab仿真
- hibernate学习(4)——实体配置详解
- Windows XPE 安装
- 服务器的全部作用,王者荣耀有哪些服务器_王者荣耀全部服务器功能详解_玩游戏网...
- Zhong__k8s基础尝试和配置flannel
- python 并行执行_python 串行执行和并行执行实例
- javascript中substring,substr和slice对比
- Matlab配平操作trim
- STM32处理器定时器分析(实现一个定时中断)