Вы могли использовать инструмент командной строки кв/см, но я не знаю, как сделать это конкретно в Python.
ОПИСАНИЕ: 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
Дальнейшее упрощение ответа 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"
Это немного окольно, но если Вы хотите, чтобы цикл был отменимым, это должно добиться цели.
Для macOS пользователей, ping
имеет опцию -o
специально для этого:
-o Exit successfully after receiving one reply packet.
, Таким образом, команда проста:
ping -o www.google.com
Это возвращается 0, когда хост был успешно проверен с помощью ping-запросов однажды.
Можно сделать цикл, отправить один ping, и в зависимости от состояния повреждают цикл, например (удар):
while true; do ping -c1 www.google.com > /dev/null && break; done
Помещение этого где-нибудь в Вашем сценарии заблокируется, до www.google.com
является дающим отклик на ping-запрос.
Проверьте с помощью 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
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ];
do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done
Можно удалить сон 1, это только здесь для предотвращения любой проблемы лавинной рассылки в случае, если, где хост был бы reacheable, но ping не выйдет с кодом 0.
Посмотрите хорошие варианты в 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
любой из вышеупомянутых циклов может также использоваться с 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
Это будет пытаться заданное количество раз.
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
Я использовал следующую функцию. Мне это нравится, потому что я могу сказать ему, чтобы он прекратил попытки через некоторое время:
#!/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
Я знаю, что вопрос старый ... и конкретно спрашивает о ping
, но я хотел поделиться своим решением.
Я использую его при перезагрузке хостов, чтобы знать когда я снова смогу вернуться к ним по SSH. (Поскольку ping
будет отвечать за несколько секунд до запуска sshd
.)
until nc -vzw 2 $host 22; do sleep 2; done
Для корректной обработки 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
}
Дальнейшее усовершенствование ответа Гордона Дэвиссона:
until $(ping -c1 www.google.com &>/dev/null); do :; done
с окружающим '$ ()' запускается подоболочка, и поэтому вы можете использовать Control-C для завершения цикла в случае, если хост недоступен.
$ 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
grep
работает с строками, поэтому:
ping google.com | grep "not"
Ребята, да, это старо. Здесь много хороших ответов.
Но я только что нашел то, что я называю красотой! В случае, если кому-то нравится родной счетчик 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