Назад | Перейти на главную страницу

Как эффективно определить с помощью интерфейса командной строки, есть ли еще сетевое соединение в Windows, Linux и macOS?

Я часто попадал в такую ​​ситуацию:

  1. Я запускаю свой постоянный сценарий основного цикла PHP CLI.
  2. Каждую минуту запускает различные скрипты.
  3. Сетевое соединение неожиданно прерывается, когда я отсутствую или не обращаю внимания.
  4. Когда я прихожу / оглядываюсь назад, у меня работают сотни экземпляров этих скриптов, потому что они не знают, что подключение к Интернету отключено, поэтому они просто продолжают накапливаться и медленно отключаются / прекращаются.

Мне нужен способ эффективно проверьте, активно ли сетевое соединение, что не требует выполнения HTTP (S) запросов или проверки связи с удаленными адресами. У меня не может быть много разных скриптов постоянно (каждую минуту), чтобы пинговать какой-нибудь плохой удаленный хост, чтобы посмотреть, смогут ли они его достичь. Это похоже на злоупотребление сетью, и это вряд ли хорошо для конфиденциальности.

Должен быть какой-то эффективный, «локальный» способ проверить, активно ли сетевое соединение!

С другой стороны, у меня бесчисленное количество раз Windows утверждала, что есть соединение, через визуальный значок в правом нижнем углу, когда его на самом деле нет, так что ... Если Microsoft не может разберись, я сомневаюсь, что это вообще возможно.

Я потратил на это бесчисленное количество часов на протяжении многих лет. Долгое время я пытался поговорить с OpenVPN, но, похоже, у него тоже нет такого «API», с которым можно было бы поговорить. Кажется, что это чрезвычайно сложная проблема для решения, возможно, даже невозможная.

В Linux, если вы хотите проверить статус ссылки в локальной сети, вы можете использовать системный вызов php, чтобы проверить "ethtool eth0" (или как там называется ваш интерфейс). Найдите строку «Обнаружена ссылка». Он скажет вам да или нет, если в интерфейсе есть действующая ссылка. Я серьезно сомневаюсь, что вы теряете местную ссылку ...

Если то, что вам действительно нужно, - это возможность определить подключение к Интернету по сравнению с состоянием локального канала или даже с возможностью локального IP-адреса, тогда вам нужно будет инициировать какое-то подключение к Интернету, чтобы сделать это определение.

Подумайте об этом так ... Ваш локальный сервер не знает об Интернете. Он знает только, как разрешать имена в Интернете, и знает, как туда добраться. Но у него нет способа узнать, действителен ли этот маршрут, пока он не попытается его использовать.

Вот почему так много случаев, которые вы видите, связаны с пингом. С точки зрения использования сети, это один из наименее болтливых способов определить, доступна ли удаленная сеть.

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

Учитывая описанный вами сценарий, похоже, что проблема в вашем конкретном приложении. Для меня наличие постоянно открытого PHP CLI звучит немного схематично, но если это действительно то, что вам нужно, тогда вам нужно будет реализовать какой-то механизм keep-alive.

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