LINUX.ORG.RU
решено ФорумAdmin

Bash-скриптинг

 


0

3

Заказчик просит странного. Поэтому приходится извращаться:

#!/bin/bash
NOW="`date +%H:%m:%S` "
FILENAME="`date +%d%m%Y`.txt"
if [ $(date +%k%M) -ge 800 ] && [ $(date +%k%M) -lt 1000 ] ; then
HOST1=`fping 172.18.18.101 -A 2>/dev/null|grep alive`
HOST2=`fping 172.18.18.102 -A 2>/dev/null|grep alive`
HOST3=`fping 172.18.18.103 -A 2>/dev/null|grep alive`
HOST4=`fping 172.18.18.104 -A 2>/dev/null|grep alive`
HOST5=`fping 172.18.18.105 -A 2>/dev/null|grep alive`
HOST6=`fping 172.18.18.106 -A 2>/dev/null|grep alive`
HOST7=`fping 172.18.18.107 -A 2>/dev/null|grep alive`
if [ -n "$HOST1" ]; then
echo $NOW $HOST1 >> /root/pc_is_alive/$FILENAME
fi
if [ -n "$HOST2" ]; then
echo $NOW $HOST2 >> /root/pc_is_alive/$FILENAME
fi
if [ -n "$HOST3" ]; then
echo $NOW $HOST3 >> /root/pc_is_alive/$FILENAME
fi
if [ -n "$HOST4" ]; then
echo $NOW $HOST4 >> /root/pc_is_alive/$FILENAME
fi
if [ -n "$HOST5" ]; then
echo $NOW $HOST5 >> /root/pc_is_alive/$FILENAME
fi
if [ -n "$HOST6" ]; then
echo $NOW $HOST6 >> /root/pc_is_alive/$FILENAME
fi
if [ -n "$HOST7" ]; then
echo $NOW $HOST7 >> /root/pc_is_alive/$FILENAME
fi
fi
Запускается кроном раз в три минуты. В выхлопе вот это:
cat /root/pc_is_alive/12092014.txt
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive
09:09:01 172.18.18.101 is alive
09:09:01 172.18.18.103 is alive
09:09:01 172.18.18.104 is alive

Подскажите, почему таймстемп у строк одинаковый?

★★★

Последнее исправление: mono (всего исправлений: 1)

Потому что он 1 раз вычисляется и записывается в переменную а потом берется каждй раз из переменной.

TDrive ★★★★★
()

Всё, что в ``, выполняется в момент, когда интерпретатор доходит до этой строки. Это значит, что у тебя левое время и левые результаты пинга: ты пишешь результаты с момента запуска, а не актуальные.

Строй команду в обычных кавычках, а не `` и выполняй её в нужное время. Или делай функции.

x3al ★★★★★
()
Ответ на: комментарий от x3al

С `` все ок, т.к. все что внутри них дергается раз в три минуты в момент запуска скрипта (он же не демоном висит).

BOOBLIK ★★★
() автор топика

Заказчик просит странного. Поэтому приходится извращаться:

ну да, именно заказчик просил тебя писать индусокод с копипастой

anonymous
()
Ответ на: комментарий от anonymous

ну да, именно заказчик просил тебя писать индусокод с копипастой

меня однажды заказчик попросил переписать код, так чтобы в нем не было обработки исключений, иначе ему не понятно было.

Yur4eg ★★
()
Ответ на: комментарий от Deleted
#!/bin/bash
NOW="`date +%T` "
for i in {1..7}
do
 VAR1="fping 172.18.18.10$i -A 2>/dev/null|grep alive"
 RESULT=$(eval $VAR1)
 if [ -n "$RESULT" ]; then
  echo $NOW$RESULT
 fi
done

Как лучше будет поступить если список ip-адресов не будет непрерывным промежутком? Стоит ли смотреть в сторону заранее заданного массива с адресами (bash это умеет?) и прохода по его индексу?

BOOBLIK ★★★
() автор топика
Ответ на: комментарий от BOOBLIK

man bash, блеать. for умеет идти по строке значений, разделенных пробелами.

anonymous
()
Ответ на: комментарий от BOOBLIK

Не забудь, что в приведённом тобой коде всё равно будет одно время.

Если адреса будут вообще разбросаны, то да. Если будет несколько прерываемых промежутков, то первое, что приходит в голову — несколько циклов. Оберни это в функцию, чтобы не повторяться. Так будет проще.

Deleted
()

В bash уже давно есть циклы. И инкремент тоже есть. И даже массивы. Намного короче же можно записать всё.

А в такой вариации значение NOW вычисляется один раз, в самом начале(а не при каждом обращении к переменной).

raven_cler ★★
()

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

zolden ★★★★★
()

Для этих целей sntop есть.

swarnk ★★
()
Ответ на: комментарий от zolden

А не костыльно как? Тут ещё же заказчик участвует, ТС, может, делает так, как его попросили, а не как лучше.

leader32
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.