Прекратить хвостовой файл на удаленном сервере, когда ввод прекращается Использование Paramiko и Flask - PullRequest
0 голосов
/ 25 апреля 2018

Я некоторое время оглядывался и не нашел ответа на это.

Вот мой пример использования:

У меня есть несколько процессов на удаленном компьютере, которые выполняются через скрипт на python, используя paramiko для ssh на машине.На данный момент моя проблема в том, что первый скрипт выполняется нормально, но зависает из-за того, что действие tail из paramiko не завершается.Ниже приведен текущий соответствующий код.

Выполнение соединения ssh:

from paramiko_expect import SSHClientInteraction


def get_logs(appid, app):
    try:
        ssh = client.connect_ssh(IPADDRESS, USER)
        interact = SSHClientInteraction(ssh, timeout=10, display=False)
        interact.send('tail -f <Path to file>)
        interact.tail(line_prefix=str(app)+': ')
    except KeyboardInterrupt:
        print('Ctrl+C interruption detected, stopping tail')
    finally:
        ssh.close()

Не показана вспомогательная функция, но проблема не в этом.ложь, чтобы я ее не включал.

Соответствующая часть основного кода приложения

@app.route('/processing', methods=['GET', 'POST'])
def processing():
    form = InstitutionForm()
    version_selected = form.versions.data
    resp = make_response(render_template('processing.html', form=form))
    sp_id = (request.cookies.get('sp_id').strip("[]").replace("L", ""), "SP")
    rs_appid = (request.cookies.get('rs_base_id').strip("[]").replace("L", ""), "RS Base")
    print "Undeploying"
    for i in [rs_appid, sp_id]:
        print i[0]
        app_actions.undeploy(i[0].strip())
        app_actions.get_logs(i[0].strip(), i[1])
        while True:
            time.sleep(10)
            status = app_actions.check_status(i, "'undeploy'")[0][2]
            print status
            if status == 'failure':
                print "undeploy failed"
                break
            elif status == 'success':
                print "undeploy succeded"
                break
            else:
                print "processing"
                pass

Так что моя проблема в том, что по сценариючерез функцию processing() он начинает отображать журналы по желанию из вызова app_actions.get_logs().После этого зависает.Похоже, это связано с тем, что вызов tail в функции get_logs() не заканчивается.

Подытожив мой вопрос:

Используя paramiko, как я могу завершить файл до его остановки, затем выйти и закрыть соединение ssh, чтобы можно было запустить следующую часть цикла?

Извините, если в этом вопросе есть какие-либо ошибки, ошибки или упущения, это мой первый вопрос, задаваемый по SO

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Таким образом, ответ, данный орлом , был правильным и указал мне правильное направление, после некоторого исследования я нашел лучшее решение.Это решение специально для библиотеки paramiko_expect, которую я использую.Есть несколько функций, которые вы можете вызвать, чтобы выйти из цикла tail.

Здесь - это запрос на извлечение, в котором они были добавлены.

Лично я использовал функцию timeout, чтобы подождать 15 секунд после того, как не был получен вход, чтобы выйти из цикла.Это прекрасно работает для меня.

Вот пересмотренный код:

def get_logs(appid, app):
    try:
        ssh = client.connect_ssh(IPADDRESS, USER)
        interact = SSHClientInteraction(ssh, timeout=10, display=False)
        interact.send('tail -f <path to file>')
        interact.tail(line_prefix=str(app) + ': ', timeout=15)
    except KeyboardInterrupt:
        print('Ctrl+C interruption detected, stopping tail')
    except Exception:
        ssh.close()
    finally:
        try:
            ssh.close()
        except:
            pass

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

0 голосов
/ 25 апреля 2018

Я бы реализовал это, используя чистый Python, а не tail.Это было частью разговора Дэна Бизи о генераторах.

import time

def tail(fin):
    fin.seek(0,2)
    while True:
        line = fin.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

_fin = open("path/to/file","r")
lines = tail(_fin)
for line in lines:
    print line,
...