问题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/