Crontab – harmonogram zadań w Linux

Crone – harmonogra zadań w systemie Linux. Pozwala na uruchomienie skryptu w powłoce o określonym czasie lub przy określonej akcji (@reboot).
Jest przydatny do automatyzacji zadań, odpalania skryptów kopii zapasowych etc, uruchomienia programu czy zadania o określonej porze. W praktyce jest to plik tekstowy, który możemy edytować preferowanym edytorem tekstu.

Składnia
Jeden wiersz o podanej niżej składni to jedno zadanie.

Dostępne wartości dla pól

MINUTY 0-59, *
GODZINY 0-23, *
DZIEN_MIES 1-31, *
MIESIAC 1-12 lub JAN-DEC, *
DZIEN_TYG 0-6 lub SUN-SAT (od niedzieli), 7 (tak, niedziela jest pod 0 i 7), *
KOMENDA Ścieżka skryptu


Gwiazdka *
Wszystkie dostępne wartości.

(oznacza uruchamianie skryptu co minutę)

Przecinek ,
Ponadto możemy wymieniać wartości po przecinku, więc gdybyśmy chcieli uruchomić zadanie np. dwa razy w miesiącu w konkretne dni miesiąca to możemy wypisać  pod DZIEŃ_MIES dwie liczby oddzielone przecinkiem. Całkiem intuicyjne.

(codziennie o 15:00 pierwszego i piętnastego dnia każdego miesiąca w każdy dzień tygodnia)

Myślnik –
Zamiast wymieniać konkretne wartości możemy podać ich zakres.

(codziennie o 15:00 od pierwszego do piętnastego dnia każdego miesiąca w każdy dzień tygodnia)

Parametry nieliczbowe
Zamiast pisać konkretne wartości daty możemy posłużyć się adnotacjami(?).

Domyślnie są uruchamiane w najniższej możliwej wartości niższego rzędu, to znaczy jeśli odpalimy @yearly to skrypt uruchomi się 1 stycznia o północy
@yearly   /home/test/example.sh

Przykłady

(codziennie o 7 i 15)

(codziennie o 7:00 i 15:00, od poniedziałku do piątku)

(co 30 minut)

(uruchom na starcie)

 

Jak edytować crona?

Lub jeśli preferujesz inne edytor…

Co dalej?
Po wpisaniu naszego zadania zapisujemy plik i sprawdzamy wyświetlamy czy z wpisem wszystko OK poleceniem (edytor poda dziwną nazwę pliku dlatego że zapisywane są one najpierw jako tymczasowe).

To tyle 🙂
PS Wykonania z crona nie będą wyświetlane w konsoli!

Logowanie w Javie – dobre praktyki

Logowanie ułatwia debugownie aplikacji, dlatego warto robić to dobrze!

  1. Loguj możliwie dużo istotnych informacji. Zadbaj o ich konsolidacje, dostępność i czytelność. Zgromadź wszystkie logi w jedym miejscu, zorientuj je na osi czasu z całą infrastrukturą i ułatw jego przeszukiwanie.
  2. Dodawaj logger w obsłudze wyjątków (try-catch)
  3. Informuj o stanie utworzonego obiektu używając metody toString() lub wyświetlając jako json.
  4. Zbieraj informację o kontekście zdarzenia by szybciej zlokalizować problem. Sprawdź co oferuje biblioteka, której używasz.
  5. Dobierz odpowiednie poziomy logowania, dzięki czemu zamiast modyfikować kod wystarczy drobna zmiana w konfiguracji loggera na produkcję.

src: stackify.com/java-logging-best-practices/

#log4j #java

Logowanie w Javie z Log4j cz.2

Konfiguracja

Zależności

Dodajemy log4j-core w wersji 2.x (1.x jest niewspierana)

Ustawiamy odpowiednią wersję kompilatora:

Plik konfiguracyjny

W katologu Resources umieszczamy log4j2.xml

Jest skonfigurowany tak by wyświetlał informacje w konsoli oraz zapisywał je do pliku (to są dwa oddzielnie skonfigurowane zadania).

Ważne: Logowanie nie będzie działało dopóki nie umieścisz Appendera w sekcji Loggers!

Praktyka

Przykład

Rezultat

Stworzyliśmy, więc folder logs, z plikiem .log. Ponadto -co na załączniku nie jest widoczne – po spełnieniu warunku (tutaj 50MB) tworzy się nowy folder zawierający datę oraz plik z nazwą wg. wzorca.

src: https://stackify.com/log4j2-java/ – how it works

Dobre praktyki

Polecam artykuł Najlepsze praktyki. Zrobiłem też mega krótką ściągę https://wilamowski.it/blog/?p=345

 

Java Best Practices for Smarter Application Logging & Exception Handling

Logowanie w Javie z Log4j cz.1

Wstęp

Po co mi logowanie?

Z czasem, gdy piszesz kolejny projekt w Javie zauważasz, że coś jest nie tak. I nie tylko chodzi o to ze okopales się kodem i zaczynasz czuć o co tu chodzi, a o wypisywanie informacji do tego co się dzieje w coraz to bardziej rozbudowanej aplikacji zaczyna być nieco niepraktyczne przy pomocy dotychczasowego wyświetlania tego w konsoli funkcja System.out.println() …
Pozwoli Tobie to organizacje logow, a umieszczenie metod logujacych w kluczowych miejscach, może pozwolić Tobie łatwiej obsługiwać i debugować aplikacje. Zdecydujesz o tym jak je wyświetlać i gdzie je przechowywać.

Cel wpisu

Przykładowa konfiguracja, tak by uzyskać zapisywanie logów w pliku tekstowym. Możliwości konfiguracyjny są oczywiście znacznie większe, celem nie jest jednak przepisywanie dokumentacji, raczej przykładowe minimalne, użyteczne użycie.

Jak przechowywać logi?

Biblioteka pozwala nie tylko na wyświetlnie danych w terminalu, ale również ich zapis do pliku .txt, bazy danych (przy użyciu JDBC).
W poniższym przykładzie pokaże jak zapisać je do pliku z roszerzeniem .out.

Konfiguracja

Zanim zaczniesz

Zanim przystąpisz do konfiguracji nie popełnij mojego błędu… 🙂
Biblioteka przestała być wspierana już jakiś czas temu, an stronie Apache znajdziemy ostatnią informację o poniższej treści.

On August 5, 2015 the Logging Services Project Management Committee announced that Log4j 1.x had reached end of life. For complete text of the announcement please see the Apache Blog. Users of Log4j 1 are recommended to upgrade to Apache Log4j 2.

src: https://logging.apache.org/log4j/1.2/

Pod linkiem znajdziesz wpis z aktualną wersją log4j2

Konfiguracja log4j2

Biblioteki i narzędzia

Poslugujac się InteliJ Idea oraz systemem budowania Maven z repozytorium pobieram poniższe zależności

TIP: Czasami IDE nie widzi nowych zależności, więc jeśli np. nie będziesz widział podpowiedzi, a to co napiszesz „z palca” system przyodziewa w czerwień użyj Reimport all Maven Projects (ikonka ze strzałkami).

PS Nie zapominamy o ustawieniu kompilatora na wersje 1.8

Konfiguracja pliku properties biblioteki log4j

W katalogu Resources zamieszczamy plik konfiguracyjny .properties. Może mieć on również postać .xml.

Sprawdzamy czy plik jest widoczny. Powinnismy dostać parametry wraz wartościami jako odpowiedź.

Gratulacje, konfiguracja zakończona 😊

Użycie obiektu klasy logger

W parametrze metody podajemy treść komunikatu, który pojawi się logu oraz w zależności od konfiguracji np. datę i godzina wywołania.

Przykładowe wywołanie:

Rozważ czy warto zamieścić w nim również np. parametry metod,  wartości zmiennych czy tych zwracanych przez metody. W określeniu poziomu logowania pomoże kolejny podpunkt.

Rodzaje logowania

Rodzaje logowania, które chcesz rejestrować muszą być dopisane w parametrze log4j.rootLogger pliku konfiguracyjnego.

ALL All levels including custom levels.
DEBUG Designates fine-grained informational events that are most useful to debug an application.
INFO Designates informational messages that highlight the progress of the application at coarse-grained level.
WARN Designates potentially harmful situations.
ERROR Designates error events that might still allow the application to continue running.
FATAL Designates very severe error events that will presumably lead the application to abort.
OFF The highest possible rank and is intended to turn off logging.
TRACE Designates finer-grained informational events than the DEBUG.

src: tutorialspoint.com

Praktyka

Krok po kroku

W każdej z klas która będzie korzystać tej funkcjonalności, umieszczamy na początku klasy

Importujemy…

Teraz w main (tutaj App) czy metodach programu umieszczamy funkcje wywołującą log.

Przejdźmy do klasy, wyglądać to ma, o, tak:

Uruchamiamy aplikację…

P.S.
Dla purystów: warto wspomnieć, że Lombok pozwala na umieszczenie adnotacji @Log4j2 dla każdej z klas w której korzystamy z logowania. Zmniejszenie ilość kodu sprawia, że kod jest czytelniejszy, choć sprawa jest kontrowersyjna 😊

Alternatywy dla log4j

Powyższa biblioteka jest kompletna, lecz istnieja tez bardziej zlozone rozwiązania jak np

Abstrakcja Simple Loggin Facade for Java, tj. SLF4J

Implementacje abstrakcji SLF4J, czyli jeden z komponentów które można dowolnie wymieniać. Tutaj użyć np. biblioteki log4j2, choć równie dobrze mógłby być to np. logback.

coronavirus

CoronaMailing (Java8+API+Mail+GSON)

Aplikacja konsumująca API, przetwarzająca JSON na obiekt i wysyłająca dane we wiadomości e-mail z HTML

Kwarantanna. Dzień n-ty.

Newsletter Postmana nt. tzw. „spraw bieżących” ( https://covid-19-apis.postman.com/ ) zainspirował mnie do napisania aplikacji z wykorzystaniem tego API. Jako, że temat najwyraźniej niestety zostanie z nami jeszcze jakiś czas to myślę, że nie jest to ostateczna wersja projektu, swoją drogą przełomowego, bo wkraczam na nieznane terytoria popularnych bibliotek. Zaskakujące są ich możliwości konfiguracji, elastyczność (log4j).
Poniższy projekt ma charakter ćwiczeniowo-edukacyjno-warsztatowy, moją wersje aplikacji znajdziesz wkrótce na GitHubie

Cel

Otrzymać na skrzynkę raport dzienny ze statystyką zachorowań.

Wymagania

  • pobrać dane z publicznego API
  • dane w postaci JSONa przekształcić na obiekt
  • przygotować strawny dla oka mail
  • wysłać wiadomość
  • plik konfiguracyjny
  • przygotować środowisko do wdrożenia
  • system budowania
  • testy
  • logi

Realizacja cz. 1 – kod

Składniki:

  • IDE Intelij Idea
  • Java 8 + Maven + JUnit4
  • GSON – parsowanie plików JSON
  • OkHttp – klient HTTP, użyjemy go do pobierania danych z zasobów darmowego API
  • Apache Common, Mail – całkiem przyjemna biblioteka do wysyłania
  • log4j2 – logowanie

Kod pod linkiem: https://github.com/connoisseur0/CoronaMailing

TODO:

  • testy
  • serializacja danych (DB)
  • wykres

Realizacja cz. 2 – wdrożenie

Składniki

  • Raspberry Pi 4
  • CentOs 7 (AltArch)
  • OpenJdk
  • cron
  • fat .jar  (.jar z zależnościami)
  • plik properties (.xml)

Na Malince zainstalowałem CentOs 7 (architektura ARM – nie jest tutaj dostępna 8), sieć,serwer FTP, przerzucam .jar z aplikacją. Instaluje OpenJdk.

Umieszczam aplikacje w katalogu.
Nie zapominamy o umieszczeniu pliku properties w tym samym katalogu!

Przechodze do katalogu i odpalam aplikację poleceniem:

Jednorazowe wykonanie aplikacji wysyła maila. Sprawdzam. Trafił na skrzynkę. Jest Ok.
Teraz mogę przystąpić do konfiguracji harmonogramu zadań – „cron”, tak bym dostawał codziennie wieczorem raport.
Upewniamy się czy czas na serwerze jest ok (TODO: konfiguracja synchronizacji z serwerem czasu).

Teraz tworzę skrypt .sh uruchamiajacy, ktory bedzie odpalany w harmonogramie:

Uruchamiam crontab przy uzyciu edytora nano:

Dopisuję wiersz (jeśli chcesz dowiedzieć się więcej o składni to zapraszam do notatki [LINK[), skrypt start.sh odpala się codziennie o 19:30:

Sprawdzamy wpis poleceniem.

Powinien zwrócić wpis.

 

To tyle.

Pozostało czekać na wiadomość.

Konfiguracja .htaccess

Strona-wizytówka w końcu nabiera kształtu. Pozbyłem się rozszerzenia .html. Mam certyfikat i przekierowanie na https.
ALE…
Wydrukowałem wizytówki na których zamieściłem ładny odnośnik do strony kontraktowej wilamowski.it/contact. Było OK, dopóki nie zmieniłem konwencji strony i małe samodzielnie podstrony trochę zaczeły mi się gryźć z resztą. Dla ustandaryzowania i łatwiejszego zarządzania moją witryną przerzuciłem strone kontaktową do CMS. Niestety jako, że index.html jest statystyczny, a WP znajduję się w podkatalogu blog to…

  • primo odnośnik z wizytówki stał się nieaktualny,
  • secundo, nowy jest długi i nieuntuicyjny, po prostu brzydki

Z pomocą przychodzi prosty redirect z adresu wilamowski.it na właściwą stronę.
Redirect 301 „/contact” /blog/?page_id=291″

Teraz wpisując wilamowski.it/contact lecimy na stronę stworzoną WP.
Wygląda lepiej.

Przykład prostej konfiguracji:

 

 

Przyjazne linki – jak usunąć rozszerzenie z linku?

Przyjazny link to taki, która jest w przystępny dla typowego konsumenta sieci. Bez zbędnych informatycznych niuansów.
W tym przypadku chcemy ocieplić wizerunek nie tylko SEO, ale również klienta, pozbywając się rozszerzeń w linkach.
wilamowski.it/contact prezentuje się znacznie lepiej bez rozszerzenia (contact).html.

By tego dokonać musimy skonfigurować serwer aplikacyjny Apache. W katalogu root (np. /var/www/) tworzymy plik o nazwie .htaccess. Każdy taki plik od góry w hierarchii folderów jest czytany oddziałuje na foldery na dole.
Wklejamy do utworzonego poniższą konfiguracje.

Gdyby apache nie czytał pliku htaccess sprawdzamy w /etc/httpd/conf/ sekcja „# Relax access to content within /var/www.”
Jeśli istnieje „AllowOverride none” to zmieniamy na „AllowOverride All”

Na koniec resetujemy usługe:
systemctl restart httpd

PS W skrypcie korzystamy z mod_rewrite, w razie problemów przeprowadzić diagnostyke*.

Linki:
Diagnostyka – https://docs.bolt.cm/3.7/howto/making-sure-htaccess-works#test-if-htaccess-is-working
W pigułce o htaccess https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ubuntu-16-04

Oracle Apex 5: odblokowanie admina bez @apxchpwd

Uruchamiamy SQLPLUS as sysdba.
1. Sprawdzamy id:

2. Zmieniamy hasło.

3. Odblokowujemy konto.

CentOS – podstawowa konfiguracja sieci

Przykładowe narzędzia/polecenia:
nmcli d – wyświetlenie nazwy urządzenia, typu (np. Ethernet), stan połączenia,
nmtui –  Network Manager pozwala edytować ustawienia IP połączenia, IPv4, IPv6, maske, brame, zmienić hostname i aktywować połączenie.
ip address show – wyświetlenie adresu IP
ifconfig – wyświetlenie adresacji wszystkich kart *1
etc/sysconfig/network – ściażka do hostname DNS
systemctl status network – sprawdzenie statusu usługi
systemctl restart network – restart usługi

*1 Gdy system zwraca „polecenie nieznane” (np. gdy używasz wersji minimalnej) oznacza to ze brakuje pakietu net tools zainstaluj go poleceniem:
yum install net-tools -y