Написание демона Python для управления несколькими удаленными хвостами? - PullRequest
3 голосов
/ 13 октября 2011

Я использую Python и Paramiko для запуска tail -f на целой куче лог-файлов на удаленных серверах с помощью предыдущего потока:

Paramiko и exec_command - уничтожение удаленного процесса?

Мой окончательный сценарий выглядит примерно так:

#!/usr/bin/env python2
import paramiko
import select
import random

tail_id = random.randint(0,500)
username = 'victorhooi'

client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('someserver.com', username='victorhooi', password='somepassword')
transport = client.get_transport()
#transport.set_keepalive(1)
channel = transport.open_session()

channel.exec_command("tail -%df /home/victorhooi/macbeth.txt" % tail_id)
while True:
    try:
        rl, wl, xl = select.select([channel],[],[],0.0)
        if len(rl) > 0:
            # Must be stdout
            print channel.recv(1024).strip()
    except KeyboardInterrupt:
        print("Caught control-C")
        client.get_transport().open_session().exec_command("kill -9 `ps -fu %s | grep 'tail -%df /home/victorhooi/macbeth.txt' | grep -v grep | awk '{print $2}'`" % (username, tail_id))
        #channel.close()
        #transport.close()
        client.close()
        exit(0)

Теперь мне нужно расширить это, чтобы справиться с фоном, управлять несколькими хвостами, а затем убивать определенные хвосты по требованию.

В идеале, у меня был бы один сценарий Python, который я мог бы раскрутить и задокументировать сам (или daemonize? Python-daemon?).Затем этот процесс может прочитать файл конфигурации и запустить отдельные вызовы paramiko для привязки каждого удаленного файла журнала.

У меня также был бы сценарий управления, который я мог бы запустить, чтобы вывести список запущенных удаленных хвостов, иубить определенных, или убить их всех, или остановить / перезапустить демон.

Какой хороший способ решения этой проблемы?Должен ли я использовать многопоточность или многопоточность или что-то еще для достижения каждого вызова Paramiko?Существуют ли какие-либо сценарии / программы, к которым я могу обратиться в качестве примера того, как это сделать?

И каков хороший способ взаимодействия сценария управления с каждым из процессов / потоков?

Ура, Виктор

...