通过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/

posted @ 2022-11-02 14:50  mosakashaka  阅读(813)  评论(0编辑  收藏  举报