Skrypt do pingu innych komputerów, wyłączający komputer przy


(Styko12) #1

Witam.

Drodzy Państwo. Mam mały problem, który może wydać się trywialny jednakże przekracza moje skromne zdolności pojmowania temat.

Mianowicie chodzi mi o skrypt wyłączający komputer, kiedy nie można spingować innej maszyny.

Sytuacja jest taka, że mamy 4 serwery - win serw 2008 R2 (na jednym 3 maszyny wirtualne co daje w sumie 7 serwerów) w serwerowni i 2 upsy. 2 serwery są bezpośrednio połączone kabelkiem do UPSA i w razie awarii prądu wyłączają się za pomocą dołączonego oprogramowania. Problem tkwi w maszynach wirtualnych i 1 z wolnostojących serwerów.

W razie awarii nie ma możliwości ich wyłączenia bo po prostu nie wiedzą, że zaraz upsy padną. Wymyśliłem sobie taką sytuację, że serwery nie podłączone do UPSów będą wysyłać ping powiedzmy co 3 minuty w kierunku dwóch podłączonych do upsa serwerów i jak nie dostaną odpowiedzi (znaczy się, że serwery wyłączyły się samoczynnie z powodu braku prądu) rozpoczną procedurę zamykania systemu.

Problem w tym, że to musi odbywać się systematycznie, gdzieś w tle, ping co 3 minuty powiedzmy.

Już parę razy próbowałem z pomocą różnych użytkowników to napisać jednakże za każdym razem coś nie działa.

Mój pierwszy kod jakiego użyłem to

#!/bin/bash

BAR=0

until [$BAR -eq 4]; do

    sleep 3m

    FOO1=`ping -c 1 192.168.100.8 | grep from | wc -l`

    FOO2=`ping -c 1 192.168.100.9 | grep from | wc -l`

    FOO=$[FOO1 + FOO2]

    if [$FOO -eq 0]; then

        BAR=$[BAR + 1]

    else

        BAR=0

    fi

done

shutdown -h now

Następnie pierwsza propozycja jednego z użytkowników

#!/bin/bash


a=1

while [$a -lt "255"]; do

    ping -i 0.2 -W 1 -c 2 192.168.0.$a | grep "bytes from" | awk '{print $4 " up"}' | sort | uniq;

    let x++;

done

i druga

#!/bin/bash


PC1="192.168.1.10"

PC2="192.168.1.11"

N=3


n=0

while true; do

  ! ping -n -q -c 1 $PC1 && \

  ! ping -n -q -c 1 $PC2 && \

  n=$(expr $n + 1) || n=0

  [$n -ge $N] && shutdown -h now

  sleep 300

done

Czy możecie stwierdzić co tutaj jest źle, że nie działa tak jak powinno???Odpalając plik .bat (w każdym z tych kodów) po prostu przleatuje mi czarny ekran, znika i nic się kompletnie nie dzieje. Nie wiem czy w tle to działa, i raczej nie bo pingowane są IP, które nie mają prawa na ping odpowiedzieć, co powinno od razu zamykać system.

Wdzięczny byłby bardzo za podpowiedź co tu zrobić i zmienić żeby zadziałało.


(Mirek Sztramski) #2
#!/bin/bash

Hmm… co sugeruje tobie powyższy nagłówek, który jest częścią prezentowanych przez ciebie skryptów?


(roobal) #3

To jest skrypt powłoki Bash, pod windowsowym wierszem poleceń, bądź PowerShell ma to prawo nie działać, chyba że zainstalujesz sobie Basha na Windowsie (Cygwin).


(Styko12) #4

Kurcze faktycznie, żem nie uwidział, że to linuksowe skrypty. Ta fraza #bash mnie zastanawiała.

To teraz pytanie, czy w ogóle na serwerze windowsowym jest możliwość stworzenia skryptu co w tle będzie sobie działał na powyższych zasadach, pingował inne komputery i jak nie wróci ping to wyłącza automatycznie maszyne??

Cygwin rozwiązał by sprawę?

Przepraszam za spam ale wpadłem jeszcze na jeden pomysł, nie tak pokręcony jak wcześniejsze. M.in. za pomocą Sheulde Task tj. Harmonogramu zadań ustawię wykonywanie skryptu powiedzmy co 5 minut. Z tym, że teraz pytanie o stricte windowsowy scrypt batch.

Chodzi mi, żeby skrypt spingował 2 adresy ip np. 192.168.1.100,192.168.1.101 powiedzmy 3 razy i jeśli nie dostanie odpowiedzi z żadnego z tych adresów wyłączył komputer.

Gdzieś wynalazłem w sieci coś takiego…czy to coś ma rację bytu???

:start1

start b.bat 192.168.1.100

start b.bat 192.168.1.101

:test1

if exist 192.168.1.100 goto test2

goto test1

:test2

if exist 192.168.1.101 goto test3

goto test2

:test3

if no exist 192.168.1.100 goto test4

goto test3

:test4

if no exist 192.168.1.101 shutdown -a

goto start1

Z góry dzięki za nakierowanie mnie na tenże problem.