2017-03-09 129 views
0

我有一個Ansible劇本,其中有像一個任務:運行bash命令時nohup和有什麼區別?

- 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劇本運行時,它隨機失敗,我必須改變server.sh以下列方式:

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

似乎nohup的和&運營商有固定的問題。

所以我想知道爲什麼&運營商解決我的問題,我的理解&將啓動一個子shell,並在後臺運行,它是與標準I/O,這引起了問題相關的東西嗎?

回答

0

只是一種預感,但我看到

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

難道不該$APACHE_HOME。 (嗯可能不是因爲它在本地啓動時起作用)。

但是我的經驗告訴我,本地和遠程執行之間的差異主要是由於環境的不同造成的。

嘗試在server.sh中添加set > /tmp/env_$$.out,並在本地和Ansible上運行它,然後檢查2個輸出文件中的(相關)區別。

相關問題