什么nohup和&运行bash命令时有所作为?

时间:2017-03-09 08:03:43

标签: linux bash ansible

我有一个Ansible剧本,其任务如下:

- name: start the apache server
  command: ./server.sh start chdir="/myapp"

server.sh

#!/bin/bash
server_wrapper.py start
server_wrapper.py中的

#!/usr/bin/python
import threading
import subprocess
cmd = "$APATCH_HOME/scripts/service.sh restart"
print cmd
ret = subprocess.call(cmd, shell=True)
if ret !=0
  logging.critical("error happend, %d" % ret)

随机失败。当我手动ssh到Ansible playbook所针对的远程服务器时,我可以通过运行$APACHE_HOME/scripts/service.sh restart看到,apache可以成功运行,它会输出一些日志记录到控制台,如Apache started successfully,看起来像标准输出。

但是当从Ansible playbook运行时,它随机失败,我必须以下列方式更改server.sh

#!/bin/bash
nohup server_wrapper.py start &

似乎nohup和&运营商已经解决了这个问题。

所以我想了解为什么&操作员修复我的问题,我理解&将启动一个子shell并在后台运行,它是否与标准i / o相关,这导致了问题?

1 个答案:

答案 0 :(得分:0)

只是预感,但我看到

cmd = "$APATCH_HOME/scripts/service.sh restart"

不应该是$APACHE_HOME。 (嗯可能不是因为它在本地启动时有效。)

但是我的经验告诉我,本地和远程执行之间的差异主要是由于环境的差异造成的。

尝试在set > /tmp/env_$$.out中添加server.sh并在本地和Ansible中运行,然后检查2个输出文件中的(相关)差异。