2011-10-03 91 views
2

我正在使用bash腳本來遍歷配置文件,並基於此,通過ssh調用python腳本。不幸的是,一旦Python腳本完成它的工作,我打電話quit bash腳本也會關閉,因此調用bash腳本的循環過早終止。如何從我的python腳本返回控件到調用bash腳本?

這裏是我的bash腳本

target | grep 'srv:' | while read l ; do srv $l $SSH ; done 

srv() { 
SSH=$2 
SRV=`echo $1 | awk -F: '{print $2}'` 
STATUS=`echo $1 | awk -F: '{print $3}'` 
open $SSH "srv" $SRV $STATUS 
} 

然後遠程機器在python腳本被稱爲

if __name__== "main": 
    redirect('./Server.log', 'false') 
    conn() 
    if sys.argv[1] == "srv": 
    ServerState(sys.argv[2], sys.argv[3]) 
    quit() 

上所以看起來像退出()也中斷了腳本。

+0

你有沒有嘗試刪除quit()語句,並讓執行到達文件的結尾? –

+0

是否退出函數fire sys.exit(0)?如果Alex的解決方案無效,你也可以嘗試。 –

+0

我剛剛嘗試對quit()函數進行註釋,以正常關閉與服務器的打開會話。 無論如何,它仍然以相同的方式表現。它可能是SSH會話嗎? 'open(){ if [$ 1 =「true」];然後 \t ssh -l「$ SSHUSER」「$ SSHOST」「$ WSLT $ PYTH $ 2 $ 3 $ 4;」 else \t $ WLST $ PYTH $ 2 $ 3 $ 4 fi }' – AleIla

回答

-1

你應該能夠簡單地從主函數返回。

0

看起來像quit()是讓程序停止的功能。

如果您可以刪除對quit()的呼叫(即,如果它什麼都不做),只需將其刪除即可。否則,你可以手工運行你的Python程序(而不是從shell腳本),看看會發生什麼:你的Python腳本可能會生成一個異常,這會使shell腳本停止。通過在真實的參數(在遠程機器上)手動運行Python程序,您應該能夠發現問題。

1

沒有遠程Python腳本也應該能夠殺死你do循環,除非你做在當地bash第一個set -e使它敏感命令失效 - 在這種情況下,將只有死,像@EOL說,你的遠程腳本正在觸發一個異常並返回一個非零/錯誤值給SSH,然後這個值會在本地死一個非零/錯誤代碼。

如果您將do srv替換爲do echo srv會發生什麼情況,以便您打印出您認爲正在運行的命令?你看到幾個srv命令行被打印出來,他們是否有你期望的觀點?

呵呵:爲什麼你使用open爲命令的每一次運行分配一個新的Linux虛擬終端?你不用這種方式用完虛擬終端嗎?