Как получить код выхода после exec_command? - PullRequest
1 голос
/ 06 мая 2020

У меня есть программа, которая запускается с моего локального компьютера и подключается через S SH (пакет paramiko) к компьютеру Linux. Я использую следующие функции для отправки команды и получения кода выхода, чтобы убедиться, что это выполнено.

По какой-то причине иногда возвращается код выхода, а иногда код вводит бесконечное l oop. Кто-нибудь знает, почему так происходит и как сделать стабильно?

def check_on_command(self, stdin, stdout, stderr):
    if stdout is None:
        raise Exception("Tried to check command before it was ready")
    if not stdout.channel.exit_status_ready():
        return None
    else:
        return stdout.channel.recv_exit_status()

def run_command(self, command):
    (stdin, stdout, stderr) = self.client.exec_command(command)
    logger.info(f"Excute command: {command}")
    while self.check_on_command(stdin, stdout, stderr) is None:
        time.sleep(5)
    logger.info(f'Finish running, exit code: {stdout.channel.recv_exit_status()}')

1 Ответ

1 голос
/ 07 мая 2020

В случае, если вы используете Python версия> = 3.6, я советую работать с асинхронной библиотекой, которая предоставляет возможности ожидания для оптимизации времени выполнения и более управляемого простого кода.

Например, вы можете используйте библиотеку asyncs sh, которая поставляется с python и выполняет работу в соответствии с запросом. Обычно написание кода asyn c, который использует спящий режим для ожидания выполнения задачи, следует заменить следующим образом.

import asyncio, asyncssh, sys

async def run_client():
    async with asyncssh.connect('localhost') as conn:
        result = await conn.run('ls abc')

        if result.exit_status == 0:
            print(result.stdout, end='')
        else:
            print(result.stderr, end='', file=sys.stderr)
            print('Program exited with status %d' % result.exit_status,
                  file=sys.stderr)

try:
    asyncio.get_event_loop().run_until_complete(run_client())
except (OSError, asyncssh.Error) as exc:
    sys.exit('SSH connection failed: ' + str(exc))

Дополнительную документацию можно найти здесь: asyncs sh

...