Nowe posty

Autor Wątek: Bash i problem z pingiem  (Przeczytany 342 razy)

Offline sheliak

  • Nowy na forum
  • *
  • Wiadomości: 1
    • Zobacz profil
Bash i problem z pingiem
« dnia: 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

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2562
  • 1709
    • Zobacz profil
Odp: Bash i problem z pingiem
« Odpowiedź #1 dnia: 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
« Ostatnia zmiana: 2021-12-22, 17:37:58 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 2840
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Bash i problem z pingiem
« Odpowiedź #2 dnia: 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. 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)
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy