Порождает многопоточный экземпляр сессий 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-объект моему классу, это даже не сработало.

0 ответов

Другие вопросы по тегам