В целях изучения питона и спортивного интереса делаю нечто вроде системы мониторинга с веб-интерфейсом
Python 2.6, сервер не имеет доступа в интернет, доустановка пакетов со сложными зависимостями (типа Paramiko) слишком геморройна, поэтому в идеале хотелось бы обойтись стандартной библиотекой
Пока что просто вывожу аптайм интересующих меня процессов.
Для единичного сервера это делается так
cat proc_uptime.sh | ssh server /bin/bash
Непосредственно в скрипте:
import commands
serverlist = [[] for i in range(SERVERS_NUM)]
for n in range(SERVERS_NUM):
cmd = 'cat test.sh | ssh server' + str(n+1) + ' /bin/bash'
serverlist[n] = commands.getoutput(cmd).split()
Т.е. получаем список списков, где для каждого сервера будет список аптаймов его процессов
Это всё даже работает и даже с приемлемой скоростью, но это пока все сервера в строю и нет ошибок.
При каких-то затыках с одним сервером в цикле у меня всё встанет колом.
Что я думаю нужно в идеале:
все запросы к серверам выполняются параллельно и отстреливаются на всякий случай после Х секунд неответа
Гугл подсказал мне для моего случая вполне подойдёт вариант с Popen
Но ман плохо раскуриваются и я так и не понял как мне с помощью Popen получить вывод скрипта в список (т.е. упорядоченно)
Лорогуру питона, посоветуйте мне полезных советов
UPDATE:
Что у меня пока получилось (Бог его знает насколько это канонично, феншуйно и надёжно, но ускорение почти линейное получилось)
serverlist = ['server01','server02','server03','fake_test_server','server04','server05']
running_procs = [Popen(['./wrapper.sh',server],stdout=PIPE, stderr=PIPE) for server in serverlist]
d = defaultdict((lambda:['N/A','N/A','N/A','N/A','N/A']))
while running_procs:
for proc in running_procs:
retcode = proc.poll()
if retcode is not None: # процесс отработал
res = proc.communicate()[0]
if res:
d[res.partition(' ')[0]] = res.partition(' ')[2].split(' ')
running_procs.remove(proc)
break
else: # процесс ещё работает, будем подождать
time.sleep(.1)
continue