Forum Linux.pl

Programowanie => Bash, skrypty powłoki => Wątek zaczęty przez: sheliak w 2021-12-18, 18:36:26

Tytuł: Bash i problem z pingiem
Wiadomość wysłana przez: sheliak w 2021-12-18, 18:36:26
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
Tytuł: Odp: Bash i problem z pingiem
Wiadomość wysłana przez: 1709 w 2021-12-22, 17:28:17
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
Tytuł: Odp: Bash i problem z pingiem
Wiadomość wysłana przez: Paweł Kraszewski w 2021-12-23, 07:31:12
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 (https://tldp.org/LDP/abs/html/). 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.

if POLECENIE
then
  # blok, gdy wykonanie POLECENIE zakończy się kodem sukcesu
else
  # blok, gdy wykonanie POLECENIE zakończy się kodem błędu
fi

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)