У меня запущено два процесса
exeAPI (работает в фоновом режиме с nohup)tail -f server.log для вывода журнала удаленного сервераЯ могу успешно видеть, как вывод выводится на мою клиентскую консоль python следующим образом:
@bp.route('/executeAPI', methods=['GET', 'POST'])
def executeAPI():
...
(ssh set up params)
print('started...')
data_buffer = ""
stdin_run, stdout_run, stderr_run = client.exec_command('nohup echo source "exeAPI" | nc 127.0.0.1 40000 &')
stdin, stdout, stderr = client.exec_command('tail -n 1 -f /home/server.log', get_pty=True)
for line in iter(lambda: stdout.readline(1024), ""):
data_buffer += line
print(line, end = "")
if not data_buffer: # never hits this if statement
print('No more data')
break
print('finished.')
client.close()
return data_buffer
Однако он никогда не покидает for loop после завершения вывода.
Как я могу выйти из for loop, если нет новых строк?
@code_onkel готово






По дизайну tail -f не завершает работу, когда процесс завершает запись в файл журнала (на самом деле он не знает разницы между выполняемым журналом и процессом, который просто очень долго записывает следующую строку). Вам, вероятно, понадобится tail -f --pid=PID, если вы можете получить pid своего фонового процесса (например, используя ps). Согласно документации, tail должен завершиться после завершения процесса с идентификатором процесса PID.
Кроме того, проверка if not data_buffer не указывает на наличие No more data. Условие if будет истинным только в том случае, если tail вернется без единого байта, записанного в stdout, поскольку data_buffer будет непустым после того, как первая непустая строка будет прочитана и добавлена. Вместо этого вы можете проверить line, но, поскольку вы используете iter() с контрольным значением, это будет излишним.
Спасибо, поэтому я проверил pid и вижу соединение сокета на pid 1422, однако есть и другие сокеты, использующие тот же pid, есть ли способ для tail это конкретное соединение сокета? Я также пробовал использовать строку, но это не остановило процесс tail.
На самом деле теперь, когда я смотрю на то, что вы пытаетесь сделать больше, я не уверен, что вы собираетесь делать. Я предполагаю, что server.log - это файл журнала сервера по адресу 127.0.0.1:40000. Он когда-нибудь выходит? Вам, вероятно, лучше попытаться поместить семафор в вывод журнала, который сигнализирует об окончании цикла.
Спасибо! Я заставил его работать с помощью re и завершить цикл, когда я получаю совпадение с уникальной строкой в конце.
Замечательно, рад, что смог помочь!
Пожалуйста, удалите / очистите свой примерный код немного. За пределами функции есть оператор возврата.