通过ansible shell模块运行java程序问题记录
问题1 启动java进程没有反应
描述
我是通过shell
模块执行一个启动脚本,脚本中通过java
命令启动spring boot的jar包,脚本的核心但是运行结束后没有反应。看起来进程并没有被执行。
脚本核心黑绒如下:
#!/bin/bash
nohup java jar xxxx.jar &
分析
没有看到任何打印,包括错误信息,不清楚是否是nohup运行导致的,于是增加错误信息重定向。
nohup java jar xxxx.jar 2>&1 nohup.log &
运行后在nohup.log中看到了错误信息,是找不到java路径,但是我在shell中是可以执行java的。
通过搜索发现,ansible使用的是nologin shell
,和普通ssh登录的login shell
不同,nologin shell
登录是不读取/etc/profile
,而我的java路径是写在/etc/profile
中的。
解决方案
nologin shell
会读取/etc/bashrc
,把java路径配置在该文件中即可。
问题2 java进程启动后即被杀死
描述
我的ansible playbook文件核心信息如下,其中start.sh
的内容即上一步中的shell脚本内容:
---
- hosts: shost1
remote_user: root
tasks:
- name: run jar
shell: ./start.sh
args:
chdir: /data/jar/
分析
这个问题看了很久,按道理start.sh
中通过nohup
启动java
进程,即使ansible进程推出,java进程也不会退出。
没有思路,于是在网上搜索,终于找到这个ansible的bug:链接,有其他人发现了ansible的这个bug,nohup
启动的进程一样会被杀死。
这个问题没有被解决,被维护方强行关闭了,但是有规避方案,就是在脚本前也加上nohup
。
解决方案
---
- hosts: shost1
remote_user: root
tasks:
- name: run jar
shell: nohup ./start.sh
args:
chdir: /data/jar/
问题3 启动后的springboot项目乱码
描述
启动后,日志打印乱码,前台有的接口请求到的中文也是乱码,但是并非全部。
重启后后正常。
分析
重启后正常,说明包没有问题。
没有思路,在网上搜索,有人提到和ansible运行环境有关。
虽然最后解决了,但是其实并未想通为什么会有这个问题。。。
解决方案
增加environment
节点,增加中文环境变量配置
---
- hosts: shost1
remote_user: root
environment:
LANG: "zh_CN.UTF-8"
LC_ALL: "zh_CN.UTF-8"
tasks:
- name: run jar
shell: nohup ./start.sh
args:
chdir: /data/jar/