#python #subprocess #ping
#python #подпроцесс #ping
Вопрос:
У меня есть сервер, на который я отправляю 4 пинга ICMP с использованием Python. Мой код выглядит следующим образом:
command = ['ping', '-c', '4', '192.168.1.8']
proc = subprocess.run(command)
if proc.returncode == 0:
print("Alive")
else:
print("Dead")
В этом коде каждый раз будут отправляться 4 запроса ping, и только после получения ответа от всех 4 будет проверяться код возврата. Однако изменение, которое я хочу внести, заключается в том, что как только любой из запросов ping завершится успешно, я хочу немедленно объявить его «живым» и двигаться дальше. Если все 4 завершаются неудачей, мы помечаем сервер как «Мертвый». Причина, по которой я хочу внести это изменение, заключается в том, что я пингую множество серверов и жду 4 ответа от каждого сервера, когда первый успешный ответ означает, что он активен, что продлевает выполнение скрипта. Я считаю, что эта модификация ускорит завершение сценария. Как я могу этого добиться?
Ответ №1:
Вместо того, чтобы пытаться остановить внешний процесс на основе его вывода, почему бы просто не выполнять один ping за раз и самостоятельно выполнять цикл:
max_tries = 4
for _ in range(max_tries):
command = ['ping', '-w', '1', '-c', '1', 'localhost']
proc = subprocess.run(command)
if proc.returncode == 0:
print("Alive")
break
else:
print("Dead")
else
Предложение будет выполнено только в том случае, если достигнут конец for
цикла, т. Е. Ответа получено не было. Измените значение timeout ( -w
) в соответствии с вашими потребностями.
Сама ping
по себе команда не предоставляет возможности досрочной остановки при получении ответа. Таким образом, вам придется захватить его выходные данные и завершить процесс, что не является элегантным и имеет много возможностей для потенциальных сбоев.