Tworzenie prostego bash-skrpytu do automatyzacji zadań za pomocą cron
1. Definiowanie zadania
Dziś napiszemy prawdziwy skrypt, który sprawdza dostępność strony internetowej i zapisuje wynik w pliku logów, a następnie zautomatyzujemy jego uruchamianie za pomocą cron
.
Co chcemy zrobić?
Stworzymy skrypt bash, który:
- Sprawdza dostępność podanej strony internetowej za pomocą
ping
. - Zapisuje wynik sprawdzenia w pliku logów, w tym czas i datę.
- Automatycznie uruchamia ten skrypt co 5 minut za pomocą
cron
.
Dlaczego to jest ważne?
W prawdziwym świecie monitorowanie dostępności stron internetowych i serwerów jest jednym z kluczowych zadań administratorów systemów. Na przykład, jeśli Twoja strona (lub serwer) nagle przestała odpowiadać, chcesz dowiedzieć się o tym tak szybko, jak to możliwe. Taki scenariusz jest przydatny nie tylko do monitorowania, ale także podczas rozmów kwalifikacyjnych lub w codziennej pracy.
2. Krok 1: Pisanie prostego bash-skryptu
Zaczniemy od napisania podstawowego bash-skryptu. Oto krok po kroku, co on będzie robił:
- Ustawimy adres strony internetowej, którą trzeba sprawdzać.
- Użyjemy
ping
w celu wysłania zapytania do serwera. - Sprawdzimy, czy otrzymano dostępny odpowiedź.
- Zapiszemy wynik do pliku logów.
Zróbmy plik site_check.sh
:
#!/bin/bash
# Określamy adres strony internetowej
WEBSITE="example.com"
# Plik do logowania wyników
LOG_FILE="/var/log/site_status.log"
# Sprawdzamy dostępność strony za pomocą ping
if ping -c 1 $WEBSITE &> /dev/null; then
# Jeśli strona jest dostępna
echo "$(date): $WEBSITE jest osiągalna" >> $LOG_FILE
else
# Jeśli strona jest niedostępna
echo "$(date): $WEBSITE jest nieosiągalna" >> $LOG_FILE
fi
Wyjaśnienie kodu:
#!/bin/bash
— wskazuje, że ten skrypt powinien być wykonywany z użyciem Bash.WEBSITE="example.com"
— adres strony, którą trzeba sprawdzić. Możesz zamienićexample.com
na dowolną stronę lub serwer, który chcesz monitorować.ping -c 1 $WEBSITE
— wysyła jeden (-c 1
) pakiet do wskazanej strony. Jeśli strona odpowiada, komenda kończy się z kodem 0. Jeśli nie — z błędem.&> /dev/null
— przekierowuje standardowe wyjście i błędy do "czarnej dziury" (nie chcemy widzieć wynikuping
w konsoli).$(date)
— dodaje aktualną datę i godzinę do wiadomości.>> $LOG_FILE
— dopisuje wynik na końcu pliku logów.
3. Krok 2: Ręczne uruchamianie skryptu
Zanim zautomatyzujemy wykonywanie skryptu, upewnijmy się, że działa poprawnie.
Zapisz skrypt w pliku
site_check.sh
.Nadaj mu uprawnienia do wykonywania:
chmod +x site_check.sh
Uruchom go:
sudo ./site_check.sh
Po wykonaniu skryptu, otwórz plik /var/log/site_status.log
, aby upewnić się, że wynik sprawdzenia został dodany do logu. Użyj komendy:
cat /var/log/site_status.log
Jeśli wszystko działa, powinieneś zobaczyć linię w stylu:
Mon Oct 30 14:35:22 UTC 2023: example.com is reachable
4. Krok 3: Konfiguracja automatycznego wykonywania z użyciem cron
Wiemy już, że cron
pozwala na uruchamianie zadań według harmonogramu. Teraz skonfigurujemy cron
, aby nasz skrypt uruchamiał się co 5 minut.
Edycja crontab
Otwórz edytor crontab
:
crontab -e
Dodaj następującą linię:
*/5 * * * * /path/to/site_check.sh
Wyjaśnienie:
*/5
— wskazuje, że zadanie powinno być uruchamiane co 5 minut./path/to/site_check.sh
— pełna ścieżka do naszego skryptu. Upewnij się, że jest poprawna. Na przykład, jeśli skrypt znajduje się w katalogu domowym użytkownika, ścieżka może wyglądać tak:/home/your_username/site_check.sh
.
Po zapisaniu zmian cron
zacznie uruchamiać skrypt co 5 minut. Aby upewnić się, że zadanie zostało dodane, wykonaj:
crontab -l
5. Krok 4: Sprawdzanie działania cron
Teraz sprawdźmy, czy automatyzacja działa. Poczekaj 5-10 minut i otwórz ponownie plik logów:
cat /var/log/site_status.log
Powinieneś zobaczyć nowe wpisy, które aktualizują się co 5 minut. Na przykład:
Mon Oct 30 14:35:22 UTC 2023: example.com jest dostępny
Mon Oct 30 14:40:22 UTC 2023: example.com jest dostępny
Mon Oct 30 14:45:22 UTC 2023: example.com jest dostępny
6. Omówienie typowych pytań i błędów
Ping zwraca błąd 'Permission denied'
Jeśli uruchamiasz skrypt jako zwykły użytkownik, możliwe, że nie masz wystarczających uprawnień. Uruchom skrypt z
sudo
lub nadaj uprawnienia do wykonywania.Plik logów się nie tworzy
Upewnij się, że ścieżka do pliku logów (
/var/log/site_status.log
) jest poprawna i że twój użytkownik ma uprawnienia do zapisu w tym katalogu. Jeśli pliku nie ma, stwórz go ręcznie za pomocą:sudo touch /var/log/site_status.log sudo chmod 666 /var/log/site_status.log
cron
nie uruchamia skryptuSprawdź, czy usługa
cron
działa:sudo systemctl status cron
Powinna być w statusie
active (running)
. Jeśli jest zatrzymana, uruchom ją:sudo systemctl start cron
Skrypt nie działa w cron, ale działa ręcznie
Upewnij się, że ścieżka do skryptu i wszystkich używanych plików jest podana w pełni. W zadaniach
cron
zmienne środowiskowe (np.$PATH
) mogą być inne. Lepiej używać ścieżek absolutnych.
7. Ulepszenia i dodatkowe zadania
Filtrowanie stron internetowych
Rozbuduj skrypt tak, aby sprawdzał dostępność kilku stron. Na przykład:
WEBSITES=("example.com" "google.com" "stackoverflow.com")
for SITE in ${WEBSITES[@]}; do
if ping -c 1 $SITE &> /dev/null; then
echo "$(date): $SITE jest dostępna" >> $LOG_FILE
else
echo "$(date): $SITE jest niedostępna" >> $LOG_FILE
fi
done
Wysyłanie powiadomień
Dodaj wysyłanie powiadomień, gdy strona jest niedostępna. Na przykład, używając polecenia mail
do wysyłania emaili:
# Powiadomienie email
if ! ping -c 1 $WEBSITE &> /dev/null; then
echo "$WEBSITE nie działa!" | mail -s "Website Check Alert" your_email@example.com
fi
Cykliczne logowanie
Ogranicz rozmiar pliku logu do, powiedzmy, 1 MB. Jeśli plik stanie się zbyt duży, zmień jego nazwę (jako archiwum) i rozpocznij nowy log.
Gratulacje! Teraz wiesz, jak używać skryptów bash i cron
do automatyzacji prawdziwych zadań. Te umiejętności są szczególnie cenione u inżynierów DevOps i administratorów systemowych.
GO TO FULL VERSION