Как проверить с помощью ping-запросов в Linux, пока хост не известен?

Вы могли использовать инструмент командной строки кв/см, но я не знаю, как сделать это конкретно в Python.

https://stackoverflow.com/questions/133883/stop-and-start-a-service-via-batch-or-cmd-file/133926#133926

ОПИСАНИЕ: SC является программой командной строки, используемой для общения с Сервисным Контроллером NT и сервисами. ИСПОЛЬЗОВАНИЕ: кв/см [команда] [сервисное название]...

  The option  has the form "\\ServerName"
  Further help on commands can be obtained by typing: "sc [command]"
  Commands:
    query-----------Queries the status for a service, or
                    enumerates the status for types of services.
    queryex---------Queries the extended status for a service, or
                    enumerates the status for types of services.
    start-----------Starts a service.
    pause-----------Sends a PAUSE control request to a service.
    interrogate-----Sends an INTERROGATE control request to a service.
    continue--------Sends a CONTINUE control request to a service.
    stop------------Sends a STOP request to a service.
    config----------Changes the configuration of a service (persistant).
    description-----Changes the description of a service.
    failure---------Changes the actions taken by a service upon failure.
    qc--------------Queries the configuration information for a service.
    qdescription----Queries the description for a service.
    qfailure--------Queries the actions taken by a service upon failure.
    delete----------Deletes a service (from the registry).
    create----------Creates a service. (adds it to the registry).
    control---------Sends a control to a service.
    sdshow----------Displays a service's security descriptor.
    sdset-----------Sets a service's security descriptor.
    GetDisplayName--Gets the DisplayName for a service.
    GetKeyName------Gets the ServiceKeyName for a service.
    EnumDepend------Enumerates Service Dependencies.

  The following commands don't require a service name:
  sc   
    boot------------(ok | bad) Indicates whether the last boot should
                    be saved as the last-known-good boot configuration
    Lock------------Locks the Service Database
    QueryLock-------Queries the LockStatus for the SCManager Database

ПРИМЕР: кв/см запускает MyService

47
задан 5 May 2014 в 03:18
17 ответов

Дальнейшее упрощение ответа Martynas:

until ping -c1 www.google.com >/dev/null 2>&1; do :; done

обратите внимание, что проверяют с помощью ping-запросов себя, используется в качестве теста абонентского шлейфа; как только это успешно выполняется, концы цикла. Тело цикла пусто с пустой командой":"используемый для предотвращения синтаксической ошибки.

Обновление: Я думал о способе заставить Ctrl-C выйти из цикла ping чисто. Это выполнит цикл в фоновом режиме, захватит прерывание (Ctrl-C) сигнал и уничтожит фоновый цикл, если это произойдет:

ping_cancelled=false    # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done &    # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $!          # Wait for the loop to exit, one way or another
trap - SIGINT    # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"

Это немного окольно, но если Вы хотите, чтобы цикл был отменимым, это должно добиться цели.

84
ответ дан 28 November 2019 в 19:38

Для macOS пользователей, ping имеет опцию -o специально для этого:

-o      Exit successfully after receiving one reply packet.

, Таким образом, команда проста:

ping -o www.google.com

Это возвращается 0, когда хост был успешно проверен с помощью ping-запросов однажды.

1
ответ дан 28 November 2019 в 19:38

Можно сделать цикл, отправить один ping, и в зависимости от состояния повреждают цикл, например (удар):

while true; do ping -c1 www.google.com > /dev/null && break; done

Помещение этого где-нибудь в Вашем сценарии заблокируется, до www.google.com является дающим отклик на ping-запрос.

25
ответ дан 28 November 2019 в 19:38
  • 1
    Это while true и break является более чистым решением, IMO. –  Dan Carley 17 July 2009 в 11:26

Проверьте с помощью ping-запросов целевой узел однажды. Проверьте, успешно выполнился ли ping (возвращаемое значение ping является нулем). Если хост не жив, ping снова.

Следующий код можно сохранить как файл и назвать с именем хоста как аргумент, или лишить первой и последней строки и использовать как функция в рамках существующего сценария (waitForHost имя хоста).

Код не оценивает причину для отказа, если ping не приводит к ответу, таким образом цикличному выполнению навсегда, если хост не существует. Моя страница справочника BSD перечисляет значение каждого возвращаемого значения, в то время как Linux, который каждый не делает, таким образом, я предполагаю это, не мог бы быть портативным, вот почему я пропустил его.

#!/bin/bash

PING=`which ping`

function waitForHost
{
    if [ -n "$1" ]; 
    then
        waitForHost1 $1;
    else
        echo "waitForHost: Hostname argument expected"
    fi
}

function waitForHost1
{
    reachable=0;
    while [ $reachable -eq 0 ];
    do
    $PING -q -c 1 $1
    if [ "$?" -eq 0 ];
    then
        reachable=1
    fi
    done
    sleep 5
}
waitForHost $1
11
ответ дан 28 November 2019 в 19:38
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ]; 
   do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done

Можно удалить сон 1, это только здесь для предотвращения любой проблемы лавинной рассылки в случае, если, где хост был бы reacheable, но ping не выйдет с кодом 0.

9
ответ дан 28 November 2019 в 19:38

Посмотрите хорошие варианты в stackoverflow. Вот образец в ударе, необходимо будет циклично выполниться по следующему коду, пока он не возвращает успешный результат ping.


ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
    echo "192.168.1.1 is up";
else 
    echo "ip is down";
fi

4
ответ дан 28 November 2019 в 19:38

любой из вышеупомянутых циклов может также использоваться с fping, а не ping, который, IMO, лучше подходит для использования в сценариях, чем сам ping. См. fping (1) для деталей.

while ! fping -q $HOSTNAMES ; do :; done

также полезный для тестирования, если машины возросли прежде, чем сделать что-то на них. Простой пример:

for h in HOST1 HOST2 HOST3 ; do
  if fping -q $h ; then
     echo -n "$h : "
     ssh $h "uname -a"
  fi
done
3
ответ дан 28 November 2019 в 19:38

Это будет пытаться заданное количество раз.

t=4; c=0; r=0; until ping -c 1 hostname.com >/dev/null 2>&1 || ((++c >= t)); do r=$?; done; echo $r

Вместо того, чтобы повторять $ r , вы можете протестировать его и действовать в соответствии с его значением:

if ((r)); then echo 'Failed to contact host'; else echo 'Continuing with script'; fi
1
ответ дан 28 November 2019 в 19:38

Я использовал следующую функцию. Мне это нравится, потому что я могу сказать ему, чтобы он прекратил попытки через некоторое время:

#!/usr/bin/env bash

function networkup {
  # Initialize number of attempts
  reachable=$1
  while [ $reachable -ne 0 ]; do
    # Ping supplied host
    ping -q -c 1 -W 1 "$2" > /dev/null 2>&1
    # Check return code
    if [ $? -eq 0 ]; then
      # Success, we can exit with the right return code
      echo 0
      return
    fi
    # Network down, decrement counter and try again
    let reachable-=1
    # Sleep for one second
    sleep 1
  done
  # Network down, number of attempts exhausted, quiting
  echo 1
}

Его можно использовать следующим образом для запуска чего-то:

# Start-up a web browser, if network is up
if [ $(networkup 60 www.google.com) -eq 0 ]; then
  firefox &
fi
0
ответ дан 28 November 2019 в 19:38

Я знаю, что вопрос старый ... и конкретно спрашивает о ping , но я хотел поделиться своим решением.

Я использую его при перезагрузке хостов, чтобы знать когда я снова смогу вернуться к ним по SSH. (Поскольку ping будет отвечать за несколько секунд до запуска sshd .)

until nc -vzw 2 $host 22; do sleep 2; done
20
ответ дан 28 November 2019 в 19:38
[(MCLVII)DCLXII] in generali cupio exspecta me database vel alius server ad eum, sed non volo expectare [(MCLVII)CMLXVII] quoque [(MCLVII)CMLXVIII] diu. In hoc codice stat pro X seconds, tunc sets ad exitus codice si servo non apparere intra terminum. [(XII)CLXXIX] Si servo appareat ante terminum, in loop ut brevi-circuited et tunc paulum ex codice can currere. [(XII)CLXXX]
0
ответ дан 28 November 2019 в 19:38

Для корректной обработки SIGINT при проверке связи BSD.

HOST=google.com NO=1; while [ $NO -ne 0 ]; do ping -W1 -c1 $HOST &>/dev/null; NO=$?;echo "$(date) ($HOST) $NO" ; done; echo "$(date) ($HOST) reachable"

как функция

ping_until(){
  local NO=1
  while [ $NO -ne 0 ]; do
    ping -W1 -c1 $1 &>/dev/null; NO=$?
    # Optionally block ICMP flooding
    # sleep 1
    echo "$(date) ($1) ($NO)"
  done
}
1
ответ дан 28 November 2019 в 19:38

Дальнейшее усовершенствование ответа Гордона Дэвиссона:

until $(ping -c1 www.google.com &>/dev/null); do :; done

с окружающим '$ ()' запускается подоболочка, и поэтому вы можете использовать Control-C для завершения цикла в случае, если хост недоступен.

0
ответ дан 28 November 2019 в 19:38
$ cat bin/check_host_up.sh
HOST=$1
PINGCMD="ping -c1 $HOST >/dev/null 2>&1"
while true; do
    eval $PINGCMD && sleep 1 && echo -n . ||    \
    (                                           \
        echo && echo "(${HOST}) down:" $(date) &&         \
            until eval $PINGCMD; do :; done &&  \
        echo "(${HOST}) up  :" $(date)
    );
done
0
ответ дан 30 April 2020 в 19:54

ping $HOSTNAME | grep от -m 1

0
ответ дан 8 May 2020 в 21:16

grep работает с строками, поэтому:

ping google.com | grep "not"

0
ответ дан 21 May 2020 в 20:45

Ребята, да, это старо. Здесь много хороших ответов.

Но я только что нашел то, что я называю красотой! В случае, если кому-то нравится родной счетчик ping:

ping $HOST | sed "/ ms$/ q"

Разве это не увлекательно? :)

[p@localhost ~]$ VBoxManage startvm VGTU-2021-LDVM1 --type headless && \
> ping 192.168.10.14 | sed "/ ms$/ q"
Waiting for VM "VGTU-2021-LDVM1" to power on...
VM "VGTU-2021-LDVM1" has been successfully started.
PING 192.168.10.14 (192.168.10.14) 56(84) bytes of data.
From 192.168.10.8 icmp_seq=1 Destination Host Unreachable
From 192.168.10.8 icmp_seq=2 Destination Host Unreachable
  ...
From 192.168.10.8 icmp_seq=35 Destination Host Unreachable
From 192.168.10.8 icmp_seq=36 Destination Host Unreachable
64 bytes from 192.168.10.14: icmp_seq=37 ttl=64 time=2003 ms
0
ответ дан 29 June 2021 в 21:10

Теги

Похожие вопросы