我在 Ansible 剧本中有一个任务,它在后台执行.jar文件,但在完成该任务后,(java) 应用程序终止。
- name: Run Java app in the background
shell: nohup java -jar app.jar &
我需要为剧本中更下方的任务运行应用程序。任何想法??注意:当我在 Putty ssh 会话中运行它时,它运行流畅,应用程序保持在后台。
最可能的原因是附加的 IO。尝试:
- name: Run Java app in the background
shell: nohup java -jar app.jar </dev/null >/dev/null 2>&1 &
好的 所以我今天遇到了这个问题,我的脚本有点不同,但本质上做同样的事情,所以这就是我所拥有的,运行在 Oracle、Centos 和 RHEL 上。
在脚本start_service.sh我有这个,这个脚本是执行的,而不是源的。
#!/bin/sh
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)"
nohup java -jar ${DIR}/$1 --spring.config.location=${DIR}/application.yml --logging.config=${DIR}/logging.xml > ${DIR}/log/output.log 2>&1 &
在我的剧本中,我有:
- name: run service
shell: "{{ service_install_location }}/application_name/start-service.sh application_name-{{ application_version }}.jar"
args:
chdir: "{{ service_install_location }}/application_name"
executable: /bin/bash
现在,BASH_SOURCE参数特定于 bash,所以如果你运行的是普通的旧 sh,那么你需要 $0。 Nohup 是必需的,因此当 SSH 连接终止时,您的后台任务不会被终止(为 Ansible 打开 -VVV 以查看正在建立的连接以了解这种情况在远程计算机上是如何发生的)。
我应该指出,我们正在暂时这样做,因为它确实应该作为服务安装以受service/init.d的控制,但现在,这回答了您的问题