我有几个Unix服务器上运行了一个应用程序,我需要从应用程序日志中在每个服务器上grep一些模式,并将所有服务器的grep结果放入一个统一文件中。
这就是我目前正在做的事情。
def run_command(command):
ps = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True)
out,err = ps.communicate()
if err != "":
return err
else:
return out
Server_List = [['ServerA','BecomeAccountA'],['ServerB','BecomeAccountB'],['ServerC','BecomeAccountC'],['ServerD','BecomeAccountD']]
Final_Result = ""
path = "some/path/"
pattern = "FindMe"
for list in Server_List:
server= list[0]
becomeaccount = list[1]
command="ssh -oConnectTimeout=5 -oBatchMode=yes -l %s %s 'grep %s %s'" % (becomeaccount,server,pattern,path)
result = run_command(command)
Final_Result+=result
with open("/some/path/output",'w') as f:
f.write(Final_Result)
现在我的output
文件包含以下内容:
14012015.1449.30 [INFO] something FindMe something
14012015.1449.40 [INFO] something FindMe something
14012015.1450.13 [INFO] something FindMe something
14012015.1450.48 [INFO] something FindMe something
14012015.1451.04 [INFO] something FindMe something
14012015.1451.19 [INFO] something FindMe something
14012015.1451.77 [INFO] something FindMe something
14012015.1452.09 [INFO] something FindMe something
要在output
文件中获得此结果,我必须依次与所有服务器建立ssh连接,这需要一段时间来处理。我需要减少代码花费的时间才能获得最终输出。我想知道我可以在多线程中做到这一点吗?我的意思是一次建立多个ssh连接?我从来没有尝试过多线程。
注意: - output
文件中行的顺序并不重要,因此也不需要ssh连接的顺序,因为我总是可以对{{{ 1}}带有时间的文件,因为它在每行的开头都有时间戳。
答案 0 :(得分:1)
我认为ps.communicate()将一直等到读取进程的所有输出。 这使您的程序顺序。
正如您所提到的,生成线程可能更好,其中每个线程调用一个子进程并处理进程输出/错误的读取。
收集输出时,您需要将它们放在允许并行访问的队列或列表中,例如,请参阅队列模块。
最后你还需要加入"线程,即。等待所有线程终止。