Порождает многопоточный экземпляр сессий ssh
У меня есть сеансы SSH, внутри каждого я имею 30 контейнеров LXC abc-1, abc-2, abc-3, ... abc-30. Я хочу войти в ssh и сохранить логи каждого контейнера в отдельном файле. Я сделал это для одного контейнера как;
from pexpect import pxssh
try:
s = pxssh.pxssh()
hostname = '***'
username = '***'
password = '***'
s.login (hostname, username, password)
print("logged in")
while 1:
time.sleep(3)
s.sendline('sudo lxc exec abc-1 -- /root/tail /usr/local/var/syslog')
s.prompt()
msg = (s.before).decode("utf-8")
with open("Output.txt", "a") as f:
f.write(msg + '\r\n')
s.logout()
except pxssh.ExceptionPxssh as e:
print ("pxssh failed on login.")
print (str(e))
Обратите внимание на вечный цикл. Теперь я хочу сделать то же самое для всех моих 30 контейнеров в ПАРАЛЛЕЛЕ. Я попытался использовать модуль Threading и поместить все в класс.
class ReadLogs(threading.Thread):
def __init__(self, erv):
threading.Thread.__init__(self)
self.erv = erv
self.s = pxssh.pxssh()
hostname = '***'
username = '***'
password = '***'
self.s.login(hostname, username, password)
def run(self):
while 1:
print('running thread for ' + self.erv)
time.sleep(5)
self.s.sendline('sudo lxc exec ' + self.erv + ' -- /root/tail /usr/local/var/syslog')
self.s.prompt()
self.msg = (self.s.before).decode("utf-8")
with open(self.erv + "_logs.txt", "a") as f:
f.write(self.msg + '\r\n')
self.s.logout()
if __name__ == '__main__':
c1 = ReadLogs("abc-1")
c1.start()
c2 = ReadLogs("abc-2")
c2.start()
при проверке этого параллелизм обоих потоков не поддерживается. Поток 1 работает больше, чем поток 2, как вы можете видеть в выходных данных ниже;
logged in
running thread for abc-1
running thread for abc-2
running thread for abc-1
running thread for abc-1
running thread for abc-1
running thread for abc-2
running thread for abc-1
running thread for abc-2
running thread for abc-1
running thread for abc-2
running thread for abc-2
running thread for abc-1
running thread for abc-2
running thread for abc-1
running thread for abc-1
running thread for abc-1
running thread for abc-1
running thread for abc-2
running thread for abc-1
running thread for abc-1
running thread for abc-1
При таком поведении abc-1_log.txt также содержит журналы abc-2 и наоборот. Это какая-то проблема с сессией SSH? или я что-то упустил? Раньше я также пытался создать 1 ssh-сессию, выполнив вход только один раз и передав этот ssh-объект моему классу, это даже не сработало.