2012-07-13 64 views
0

我使用自動SSH腳本通過SSH複製/運行/將硬件測試記錄到幾臺計算機上,除了一件事以外,一切正常。測試文件應該每30分鐘運行一次並收集數據,然後將其寫入文件直至被殺死。缺少一個更好的示例:while(True)loop break SSH script

注意:這些文件都不是實際的代碼。我沒有在我面前複製它。

file.py:

#!/usr/bin/env python 
import os 

idleUsage = [] 
sleepTime = 1800 

while(True): 
    holder = os.popen('mpstat | awk \'{printf("%s\n", $9)}\'') 
    idleUsage.append(100.0 - float(holder[1])) 

    f = open("output.log", 'w') 
    f.write(%idleUsage) 
    f.close() 

    sleep(sleepTime) 

automatic-ssh.sh:

#!/bin/bash 

autossh uname1 password1 ip1 command <----gets stuck after ssh runs 
autossh uname2 password2 ip2 command 
autossh uname3 password2 ip3 command 

沒有失敗,它卡住上運行的命令。我已經嘗試過'命令&',並且在整行代碼末尾添加了&符號。任何人都有一些建議?

+0

我認爲你需要做'os.system(「sar | grep kb」)......不知道,但我不認爲這是一個有效的蟒蛇行... – 2012-07-13 16:25:12

+7

這看起來不像Python句法。 – 2012-07-13 16:25:16

+0

我知道這是不正確的語法,但它只是一個例子,甚至在代碼中。我關心的是讓while循環運行而不停止我的auto-ssh腳本。 – 2012-07-13 17:18:49

回答

1

不知道你目前的情況下,但我會建議使用subprocess

from subprocess import Popen 

p1 = Popen(["sar"], stdout=PIPE) 
p2 = Popen(["grep", "kb"], stdin=p1.stdout, stdout=PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 
+0

我會稍微嘗試一下。截至目前,我發現腳本的臨時解決方案會殺死所有SSHD,然後在進入while循環之前啓動SSHD備份。 – 2012-07-16 11:56:33

0

所以,你的shell腳本通過ssh連接到遠程計算機並運行一個無盡的蟒蛇命令,你想要的SSH連接進入背景?

#!/bin/sh 
ssh thingie 1 > out.1 & 
ssh thingie 2 > out.2 & 
ssh thingie 3 > out.3 & 
wait 

這會在後臺踢了三名SSH命令登錄到單個文件,然後腳本將等待,直到他們全部退出(wait,如果不給一個PID作爲參數,等待所有的孩子出口)。如果你殺死腳本,那麼子ssh進程也應該終止。我不確定這是否是你要求的,但也許它有助於某些事情? :)