Green 10.12.2010 08:34

Есть вопрос!Conky и ping

Возникло у меня желание мониторить коньками пинг до серверов, чтобы сразу видеть, если какой-то из них отвалится. В интернетах нашёл такой вариант решения:
1
${execi 60 ping -c 1 192.168.10.1 |grep "time=" | sed "s@^.*time@time@"}


всё работает, на выходе выдаёт строку формата: time=x.xxx ms

Но меня это немного не устраивает, т.к. нужно пинговать одновременно полтора десятка серверов и при этом варианте вывода оно занимает слишком много места на экране. Подскажите, как можно сделать вывод только времени пинга безо всяких time= и ms?


Тэги: conky ping
+ 2 -
Похожие Поделиться

saver 10.12.2010 08:51 #
icinga, nagios (что по факту одно и тоже), cachi, zabbix. Все таки 10-15 серверов уже что-то.
cubiccat 10.12.2010 08:59 #
Первое, что пришло в голову
ping -c 1 blabla | grep "time=" | sed 's/^.*time=//' | sed 's/ ms$//'
xT 10.12.2010 09:11 #
два седа можно объединить в один
sed 's/^.*time=//;s/ ms$//'
slava sh. 11.12.2010 21:52 #
два регулярных выражения можно объединить в одно
sed 's/^.*time=\| ms$//g'
xT 10.12.2010 09:07 #
ping -c 1 host | grep time= | awk '{print $7}' | sed s/time=//
lava 10.12.2010 10:25 #
grep time= | awk '{print $7}'
равносильно
awk '/time=/{print $7}'

но в общем и целом я бы написал совершенно иначе:

$ bash -c 'HOSTNAME=login.icq.com; PING_RESULT=`ping -c1 -W1 $HOSTNAME` && echo "$PING_RESULT" | sed -nr "s/^.*time=(<0-9>+\ *ms).*$/\1/p" || echo OFFLINE'
168 ms
$ bash -c 'HOSTNAME=icq.com; PING_RESULT=`ping -c1 -W1 $HOSTNAME` && echo "$PING_RESULT" | sed -nr "s/^.*time=(<0-9>+\ *ms).*$/\1/p" || echo OFFLINE'
OFFLINE

Предлагаю эту команду в этом виде только если нет желания создать небольшой скриптик и кинуть его куда-нибудь в /usr/local/bin.
mealsforall 10.12.2010 09:44 #
fping host || echo "DOWN"
k1b 10.12.2010 09:49 #
+500 fping
Daria 11.12.2010 10:48 #
на правах смехуючечков:

for a in {1..1000}; do sudo ping -f $host; done 1> /dev/null && echo $host DOWN
lava 11.12.2010 19:04 #
Неправильно =)

1) цикл из тысячи последовательных флуд пингов
2) у меня sudo спрашивает пароль рута при каждом запуске. 1000 запусков - это многабукаф
3) "&&" тут ни к селу, ни к городу. Достаточно ";"

su -c 'host=192.168.1.1; ln -sf /dev/null ./nohup.out; for a in {1..1000}; do nohup ping -f $host 1>/dev/null 2>&1 &; done; echo $host DOWN'

Но на самом деле может означать, что DOWN не столько целевой хост, сколько Ваш собственный. Одна машина не создаст поток соединений, который вызовет отказ в обслуживании удалённой машины. Скорее будет забит собственный интерфейс.
DimoNya64 10.12.2010 10:49 #
ping -c 1 82.116.60.4 |grep "time=" | sed "s/^.*time=\(<0-9>\{1,\}\(.<0-9>\{1,\}\)*\)\( ms\)/->\1/"

или, если экранировать не нужно ..

ping -c 1 82.116.60.4 |grep "time=" | sed "s/^.*time=(<0-9>{1,}(.<0-9>{1,})*)( ms)/->\1/"
lava 10.12.2010 15:24 #
народ, почему так много примеров с любовью к грепу и конвейерам, если уже определено, что используется sed? к чему лишние вызовы и конвейеры? это же только потери.

grep "smth" | sed "s/smth//"
равносильно
sed -n "s/smth//p"

<0-9>{1,} есьм <0-9>+
DimoNya64 10.12.2010 16:16 #
согласен ... меньше кнопкоф ... но суть та же ... =)
Shtsh 10.12.2010 12:53 #
В любом случае мониторить нужно хосты и сервисы на них. Так что настрой nagios. Он тебе и смс отошлёт, если что случится. Это самый адекватный способ следить за проблемами.
x0x01 10.12.2010 13:52 #
zabbix еще невообразимо хорош! ;)
lava 10.12.2010 17:07 #
Немного поразвлекался, сваял скриптик. Суть - пингует пачку серверов параллельными потоками.

Синтаксис прост как грабли: скрипт опции хосты
(на самом деле опции и хосты можно вперемешку)

Опции:
-c|--color) # Colored output
-u|--units) # Show measurements units
-t|--timeout) # Set different timeout
-a|--accessible-only) # Do not show servers which are unavailable

Минусы обусловлены асинхронной работой: никакой сортировки, параллельные потоки "корректируют" время отклика в худшую сторону (например, мой модем в пачке с десятком других хостов откликается порядка 30ms при обычных 1-2ms).

В общем, так, если кому интересно поковырять. А так он и мне-то не нужен %)
А автору топика стоило бы хоть привести пример, что он хочет видеть и как запускать (одной командой пачку али каждый хост отдельно).

srv_check.sh
#!/bin/sh

###
#
# @author lava
#
# Check list of servers on availability
#

# Default options
TIMEOUT=1

#
# Get options from command-line arguments
SHORTOPTS='Qcut:a'
LONGOPTS='query,color,units,timeout:,accessible-only'

ARGS=$(getopt -a -n $(basename "$0") \
-o ${SHORTOPTS} \
-l ${LONGOPTS} \
-- "$@" \
2>/dev/null)

eval set -- "$ARGS"

#
# Parse args
while << "${1}" != -- >>
do
case "${1}" in
-Q|--query) # Quick query mode for single host
QUERY=true
;;
-c|--color) # Colored output
COLOR=true
;;
-u|--units) # Show measurements units
UNITS=true
;;
-t|--timeout) # Set different timeout
TIMEOUT=${2}
shift
;;
-a|--accessible-only) # Do not show servers which are unavailable
ACCESSIBLE=true
;;
esac
shift
done
shift # Remove last processed key


if < "$QUERY" = "true" >
then
###
#
# Query mode accepts only a single host to ping and give an output information
#

HOST=$1

PING_RESULT=`ping -c1 -W$TIMEOUT $HOST 2>&1`
if < $? = 0 >
then
< "$COLOR" = "true" > && RESULT="\033<32m" || RESULT=""
< "$UNITS" = "true" > && UNITSED="\3" || UNITSED=""
RESULT=$RESULT`echo "$PING_RESULT" | sed -nr "s/^.*time=(<0-9>+(\.<0-9>+)?)(\s*+).*$/\1$UNITSED/p"`
else
< "$ACCESSIBLE" == "true" > && exit 1
< "$COLOR" = "true" > && RESULT="\033<31m" || RESULT=""
RESULT="$RESULT"OFFLINE
fi

< "$COLOR" = "true" > && RESULT=$RESULT"\033<0m"
echo -e "$HOST: $RESULT"
else
###
#
# Manager mode: will launch separate instance for every host and wait them all
#

BIN=`readlink -f "$0"`

for HOST in $@
do
OPTS="-t$TIMEOUT"
< "$COLOR" = "true" > && OPTS="$OPTS -c"
< "$UNITS" = "true" > && OPTS="$OPTS -u"
< "$ACCESSIBLE" = "true" > && OPTS="$OPTS -a"
$BIN -Q $OPTS $HOST &
PID_LIST="$PID_LIST $!"
done

wait

fi
lava 10.12.2010 17:29 #
Хм. Звбыл удалить остатки экспериментов: переменная PID_LIST не нужна.