LINUX.ORG.RU
ФорумAdmin

noping скрипт работает не совсем так, как надо бы...

 ,


0

1


#!/bin/bash


##define variables
address=«email@email.com»
ping_ip=192.168.200.112

echo «ip for ping is: » $ping_ip

while true; do
#    COUNT=$(find . -mmin -10 -type f | wc -l)
#    if [ $COUNT eq 0 ]; then
ping -c3 $ping_ip >/dev/null
    if [ $? != 0 ];then
    echo $?;
    echo «Ping Fail - `date`»;
    body=" Admin, we have problems on S2! last incoming files was: $ping_ip ,`date` "  ;
    echo -e $body | mail -S smtp=220.20.30.23 -S from=email@email.com -s «Ping Warning on S2»   $address;
    fi
echo «Host Found - `date`»;
sleep 60;
done;


echo «SCRIPT ENDED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!»



вобщем, тут сразу две проблемы - в данном случае, если хост пингуется, всё выглядит ок - отрабатывает только часть кода с 
host found
sleep

:
Host Found - Fri Nov 24 13:21:51 GMT 2017
Host Found - Fri Nov 24 13:22:53 GMT 2017


но если хост не отвечают - обе конструкции почему то начинают работать:

ip for ping is:  192.168.200.112
0
Ping Fail - Fri Nov 24 13:19:45 GMT 2017
Host Found - Fri Nov 24 13:19:45 GMT 2017


и так по кругу, хотя в случае фэйла должно отрабатывать только 

«ping fail» ...?

если же применить 
 if [ $? eq 0 ];then

то сыплет такими ошибками почему-то
./noping_wkg.scr: line 17: [: eq: binary operator expected 

как это всё побороть, и почему так?
Буду благодарен за советы и комментарии...


и так по кругу, хотя в случае фэйла должно отрабатывать только «ping fail» ...?

У тебя echo «Host Found - `date`»; вне условий.

vvn_black ★★★★★ ()
 if [ $? -eq 0 ]; 


перед eq должен быть минус, это типа опция команды [

bl ★★★ ()

но если хост не отвечают - обе конструкции почему то начинают работать:

У тебя должно быть if .... else ... fi.

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

У тебя echo «Host Found - `date`»; вне условий.

как это - вне?

разве блок «if-then-fi» не должен работать одним условием, и в случае включения этого условия возвращаться по достижении fi к «while true» ? :-O

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

и в случае включения этого условия возвращаться

Нет.

У тебя должно быть if .... else ... fi.

Две ветки, одна при достижении условия, вторая наоборот.

Всё что вне if ... fi, но внутри while ... done, выполняется всегда.

vvn_black ★★★★★ ()
Последнее исправление: vvn_black (всего исправлений: 4)

Ко всему вышеизложенному:

Уберите все точки с запятой на конце строк, они тут не нужны.

echo $? внутри if-а у вас показывает статус не ping-а, а команды '['.

Последний echo не будет отрабатывать никогда :)

Код надо писать в разметке кода для Bash из www.linux.org.ru/help/lorcode.md

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

спасибо за информацию. последний, да, поместил дабы отловить событие когда все условия кончаются - была мысль, что условие пропадания пинга, когда отсылается мыло, после фи выходит за блок «done»

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

не, всётаки чтото непонятное:


#!/bin/bash


##define variables
address="info@email.com"
ping_ip=192.168.0.1

echo "ip for ping is: " $ping_ip

while true; do
#    COUNT=$(find . -mmin -10 -type f | wc -l)
#    if [ $COUNT -eq 0 ]; then
# !=0
    echo "script runtime, seconds: " $SECONDS
    ping -c3 $ping_ip #>/dev/null
    echo $?
    if [ $? = !0 ];
        then
        echo "Ping Fail - `date`"
        body=" Admin, we have problems on S2! last incoming files was: $ping_ip ,`date` "  ;
        #echo -e $body | mail -S smtp=192.168.100.1 -S from=info@email.v  -s "Ping Warning on S2"   $address;
	else
	echo "Ping OK - `date`"
    fi

#echo "Ping OK - `date`"
sleep 6
done;


echo "SCRIPT ENDED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"

но нет правильной отработки скрипта. то есть, что есть пинг ( возвращаемый $? код есть 0), что нет пинга ( таймоут, возвращаемый код 2) - выполняется одна из секций,а не разные, хотя ведь в начале есть условие по значению $? и соотетственно должна быть перекидка по сему условию - либо в then,  если пинг есть, либо в елсе, если пинга нет, а оно всегда выдаёт секцию «пинг ок»...

что за чертовщина? :-О


bash-3.2$ ./noping_test.scr
ip for ping is:  192.168.0.1
script runtime, seconds:  0
PING 192.168.0.1 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=1.393 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=2.511 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=5.724 ms

--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.393/3.209/5.724/1.836 ms
0
Ping OK - Fri Nov 24 21:32:43 EET 2017
script runtime, seconds:  8
PING 192.168.0.1 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=7.742 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=10.349 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=1.451 ms

--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.451/6.514/10.349/3.735 ms
0
Ping OK - Fri Nov 24 21:32:51 EET 2017
^C

bash-3.2$ ./noping_test.scr
ip for ping is:  192.168.0.10
script runtime, seconds:  0
PING 192.168.0.10 (192.168.0.10): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
92 bytes from 192.168.122.1: Destination Host Unreachable

--- 192.168.0.10 ping statistics ---
3 packets transmitted, 0 packets received, 100.0% packet loss
2
Ping OK - Fri Nov 24 21:33:15 EET 2017
^C

bash-3.2$ 



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

Вот это что такое [ $? = !0 ]?

Проще показать, чем объяснять:

#!/bin/bash

while true; do
    ping -c 3 ya.ru > /dev/null 2>&1

    if [ $? -eq 0 ]
    then
        echo success
    else
        echo loss
    fi

    echo sleeping 5 sec..

    sleep 5
done

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

Вот это что такое [ $? = !0 ]?

ай, ну чтоб я знал - я там и != и == и -eq и -gt успел испробовать, но нифига толком так и не понял, кроме того что изменения есть / нет пинга в работе скрипта нет.

потом нашёл это:

Code:

#!/bin/bash
echo "Parameter $1"
echo "$?"
$SCHRODINGER/utilities/reagentprep -listfull | grep $1
echo "$?"

if [ $? == 1 ]then
echo "Error"
exit
fi
the if statement is evaluating the echo Condition, not the grep as intended.

try instead

$SCHRODINGER/utilities/reagentprep -listfull | grep $1

STATUS=$?
echo "$STATUS"

if [ $STATUS == 1 ]then
echo "Error"
exit
fi

переделал своё творение, и в финале в таком виде оно заработало правильно ( наконец-то! ):

while true; do
#    COUNT=$(find . -mmin -10 -type f | wc -l)
#    if [ $COUNT -eq 0 ]; then
# !=0 -eq -gt
    echo "script runtime, seconds: " $SECONDS
    ping -c3 $ping_ip >/dev/null
    STATUS=$?
    echo $STATUS
    if [ $STATUS -gt 0 ];then
	echo "Ping Fail - `date`"
	body=" Admin, we have problems on S2! last incoming files was: $ping_ip ,`date` "  ;
	#echo -e $body | mail -S smtp=192.168.100.1 -S from=info@mail.v  -s "Ping Warning on S2"   $address;
    else
	echo "Ping OK - `date`"
    fi

#echo "Ping OK - `date`"
sleep 6
done;


echo "SCRIPT ENDED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"


твой тоже проверил, работает отлично, гран мерси! будешь в риге, куплю пиво :) вообще то надо бы както в питер в этой жизни на мопедке сьездить, да визовый вопрос не особо нравится ( ну и плюс ваши дороги, которые вроде бы ещё хуже наших, и водятелы, которые по рассказам ещё больше наших-же ( которые тож совсем не фонтан) прямо спят и видят как бы какого мопедиста задавить :D

wisedraco ★★ ()
Последнее исправление: wisedraco (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.