Green 10.12.2010 08:34
Есть вопрос! — Conky и ping
Возникло у меня желание мониторить коньками пинг до серверов, чтобы сразу видеть, если какой-то из них отвалится. В интернетах нашёл такой вариант решения:
1 |
|
всё работает, на выходе выдаёт строку формата: time=x.xxx ms
Но меня это немного не устраивает, т.к. нужно пинговать одновременно полтора десятка серверов и при этом варианте вывода оно занимает слишком много места на экране. Подскажите, как можно сделать вывод только времени пинга безо всяких time= и ms?
saver 10.12.2010 08:51 #
+ 2 -
icinga, nagios (что по факту одно и тоже), cachi, zabbix. Все таки 10-15 серверов уже что-то.
Первое, что пришло в голову
ping -c 1 blabla | grep "time=" | sed 's/^.*time=//' | sed 's/ ms$//'
ping -c 1 blabla | grep "time=" | sed 's/^.*time=//' | sed 's/ ms$//'
два регулярных выражения можно объединить в одно
sed 's/^.*time=\| ms$//g'
grep time= | awk '{print $7}'
равносильно
awk '/time=/{print $7}'
но в общем и целом я бы написал совершенно иначе:
Предлагаю эту команду в этом виде только если нет желания создать небольшой скриптик и кинуть его куда-нибудь в /usr/local/bin.
равносильно
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.
fping host || echo "DOWN"
на правах смехуючечков:
for a in {1..1000}; do sudo ping -f $host; done 1> /dev/null && echo $host DOWN
for a in {1..1000}; do sudo ping -f $host; done 1> /dev/null && echo $host DOWN
Неправильно =)
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 не столько целевой хост, сколько Ваш собственный. Одна машина не создаст поток соединений, который вызовет отказ в обслуживании удалённой машины. Скорее будет забит собственный интерфейс.
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 не столько целевой хост, сколько Ваш собственный. Одна машина не создаст поток соединений, который вызовет отказ в обслуживании удалённой машины. Скорее будет забит собственный интерфейс.
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/"
народ, почему так много примеров с любовью к грепу и конвейерам, если уже определено, что используется sed? к чему лишние вызовы и конвейеры? это же только потери.
grep "smth" | sed "s/smth//"
равносильно
sed -n "s/smth//p"
<0-9>{1,} есьм <0-9>+
grep "smth" | sed "s/smth//"
равносильно
sed -n "s/smth//p"
<0-9>{1,} есьм <0-9>+
В любом случае мониторить нужно хосты и сервисы на них. Так что настрой nagios. Он тебе и смс отошлёт, если что случится. Это самый адекватный способ следить за проблемами.
Немного поразвлекался, сваял скриптик. Суть - пингует пачку серверов параллельными потоками.
Синтаксис прост как грабли: скрипт опции хосты
(на самом деле опции и хосты можно вперемешку)
Опции:
-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
Синтаксис прост как грабли: скрипт опции хосты
(на самом деле опции и хосты можно вперемешку)
Опции:
-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