Programowanie > Bash, skrypty powłoki
Bash i problem z pingiem
(1/1)
sheliak:
Witam
Jestem dość cienki w bash'u i nie mogę rozwiązać jednego problemu. Otóż próbuję napisać skrypt pingujący konkretny adres w pętli cały czas i w zależności od tego czy adres jest online czy nie skrypt ma uruchamiać przekaźnik bądź wyłączać
#!/bin/bash
if ping 192.168.143.50 >0; then // nie bardzo wiem jak skonstruować warunek
echo 1 > /sys/class/gpio/gpio4/value
else
echo 0 > /sys/class/gpio/gpio4/value
fi
To pewnie jest banał ale zablokowałem się :) nie mogę ruszyć dalej, więc bardzo proszę o pomoc.
Dzięki wielkie
1709:
A po co pętla jesli moge spytac ?
Nie wystarczy raz na jakiś czas ?
Cron pozwala na ustawianie poleceń o konkretnej godzinie.
https://en.wikipedia.org/wiki/Cron
https://pl.wikipedia.org/wiki/Crontab
Edycja
Sprawdz to https://stackoverflow.com/questions/18123211/checking-host-availability-by-using-ping-in-bash-scripts/18123399#18123399
Paweł Kraszewski:
Problemem początkujących jest to, że traktują shell jak każdy inny język programowania — a tak nie jest. Poczytaj sobie Advanced Bash-Scripting Guide. Wiele z początkowych rozdziałów ma zastosowanie do "zwykłego" sh.
W Twoim przypadku różnica polega na tym, że IF nie jest tym, czym się wydaje.
--- Kod: ---
if POLECENIE
then
# blok, gdy wykonanie POLECENIE zakończy się kodem sukcesu
else
# blok, gdy wykonanie POLECENIE zakończy się kodem błędu
fi
--- Koniec kodu ---
Magia polega na tym, ze if nie sprawdza warunku w rozumieniu if z C/Pythona czy innego języka. If w shellach uruchamia wskazany proces potomny i jedyne co robi, to sprawdza, czy zakończył się on błędem (return w main(){} zwrócił coś innego niż 0) czy sukcesem (return w main(){} zwrócił 0),
Polecenie ping samo w sobie (poczytaj ostatnie akapity dokumentacji) zwraca w statusie informację, czy pojawiła się choć jedna odpowiedź, czy też nastąpił jakiś błąd (błędny adres, błąd routingu, całkowity brak odpowiedzi, itp).
Poczytaj sobie o poleceniu ping, jak uzyskać następujący zestaw efektów:
* Jak nic nie wyświetlać na ekranie (interesuje cię tylko wynik sukces/porażka zgłaszany jako status powrotu)
* Jak wysłać tylko konkretną liczbę pakietów (wygląda na LAN, więc powinny wystarczyć góra 2-3)
* Jak zakończyć ping wcześniej, gdy dostaniemy choć jedną pozytywną odpowiedź
Tu też twoja decyzja, czy rozdzielczość 1 minuty ci wystarczy (bo cron nie potrafi wołać częściej), czy chcesz bardziej real-time (i zrobić to w pętli z opóźnieniem między iteracjami, np 5 albo 10s)
Nawigacja
Idź do wersji pełnej