Narzędzia linuxowe – podstawy programisty

Autor
Damian
Terlecki
32 minuty
Inne

Kiedy projekt przechodzi w fazę utrzymania, zwykle oznacza to, że system działa już w środowisku produkcyjnym, a główna faza rozwojowa została zakończona. W tym okresie, a zwłaszcza na wczesnych jego etapach, następuje zmiana kierunku z wprowadzaniu nowych funkcji na naprawę błędów i implementację przeoczonych przypadków brzegowych. Może to być efektem przepływów danych, które nie zostały w pełni zasymulowane podczas testowania (dane nieprodukcyjne). Przypadki takie mogą być trudne do odtworzenia, szczególnie gdy informacje pochodzące ze zgłoszenia o błędzie nie są wystarczająco szczegółowe.

Implementacja prawidłowego logowania wewnątrz aplikacji pozwala programistom na szybką identyfikację źródła problemów. Nawet w późniejszych fazach o wiele łatwiej jest zapewnić wsparcie biznesowe dla złożonych projektów, gdy integrowane są dodatkowe systemy. Aby jednak w pełni wykorzystać logi, niezwykle ważne jest posiadanie rozwiązania do ich indeksowania i przeszukiwania. Popularnym wyborem jest tutaj tzw. stos ELK (E – Elasticsearch, L – Logstash, K – Kibana). Ta kombinacja umożliwia agregowanie logów z różnych źródeł, przekształcanie ich do formatu JSON, wyszukiwanie, filtrowanie i wizualizację.

Narzędzia uniksowe w systemie Windows

Czasami możemy nie mieć szczęścia, nie mając takiego rozwiązanie pod ręką, bądź sytuacja może wymagać spojrzenia na surowe logi. W takim przypadku wszystko, czego możesz potrzebować, to środowisko Linux lub tylko kilka podstawowych narzędzi, które udostępnia. Jeśli korzystasz z systemu Windows – nic straconego. Najprawdopodobniej masz już zainstalowany program Git. Podczas instalacji pojawiło się zapytanie o opcjonalną instalację narzędzi uniksowych. W przypadku pominięcia tej opcji – nadal możemy dokonać aktualizacji, uruchamiając najnowszą wersję instalatora bez żadnych negatywnych efektów.

Instalacja narzędzi uniksowych z Gitem

Sam korzystam z trzeciej opcji, co jak mówi ostrzeżenie, może powodować inne zachowanie niż domyślne (Windowsowe) z powodu zastąpienia niektórych poleceń. W przypadku wykrycia problemu (od dłuższego czasu jeszcze mi się to nie przytrafiło) możesz po prostu usunąć je ze zmiennej środowiskowej PATH, ale jeśli nadal masz wątpliwości, możesz równie dobrze wybrać drugą opcję. Ja natomiast wolę trzecią opcję ze względu na znacznie lepsze narzędzie sort. Kolejną miłą rzeczą jest to, że powłoka Git Bash jest dostarczana wraz z programem SSH, więc nie musisz instalować dodatkowych klientów, takich jak PuTTY czy WinSCP.

Teraz powinniśmy być w stanie dostać się do Basha (jest w zmiennej środowiskowej PATH):

Uruchamianie Bash z paska adresu w Eksploratorze Powłoka Git Bash w systemie Windows

Jeśli na zdalnym komputerze działa system Linux, może pojawić się pokusa, aby pominąć tę instalację. Jednak w zależności od środowiska niektóre zadania, takie jak przetwarzanie danych, lepiej uruchomić na komputerze lokalnym, aby zmniejszyć zużycie zasobów serwerowych (miejsce na dysku, pamięć RAM i zużycie procesora).

Przydatne narzędzia i polecenia

Korzystanie z poleceń i narzędzi przedstawionych poniżej może nie być trywialne w przypadku braku jakiejkolwiek uprzedniej interakcji ze środowiskiem Linuksowym, ale nie poddawaj się. Na dłuższą metę ich opanowanie znacznie zwiększy Twoją wydajność. Na razie przyjmijmy znajomość podstawowych poleceń (ls,cd, pwd) i oraz różnic między katalogiem domowym (~/ lub /home/user/) a rootem (/). Bez zbędnych ceregieli:

PoleceniaOpis
ssh user@hostname
The authenticity of host (...) can't be established.
RSA key fingerprint is (...)
Are you sure you want to continue connecting (yes/no)?
Przy pierwszym połączeniu ze zdalnym hostem może zostać wyświetlony monit o odcisk palca klucza RSA wraz z prośbą o potwierdzenie. Idealnie powinniśmy porównać odcisk z tym, który otrzymaliśmy z zaufanego źródła, aby upewnić się, że nie łączymy się z podstawionym hostem.

Następnie zostaniemy poproszeni o podanie hasła. Jeśli sytuacja wymaga automatycznego logowania (skrypt), potrzebować będziemy klucza SSH lub dodatkowych narzędzi.
ssh -t user@hostname 'top -n 1 | head -n 5' ssh -t user@hostname 'top -n 1 | head -n 5 > top.log' ssh -t user@hostname 'top -n 1 | head -n 5' > top.log Jest to podstawowy sposób na zdalne uruchomienie polecenia (zamiast otwierania powłoki) za pomocą SSH. Apostrofy służą do oznaczenia części, która będzie uruchamiana na serwerze. Zauważ różnicę między trzecim a drugim poleceniem, które spowoduje utworzenie pliku lokalnie lub na serwerze. Parametr -t został tu dodany, aby móc wywołać polecenie top, które jest programem ekranowym.
scp /path/to/file user@hostname:/path/to/destination
scp user@hostname:/path/to/file /path/to/destination
Program SCP pozwala kopiować pliki na (pierwsze polecenie) i ze (drugie) zdalnego serwera. Zwróć uwagę, że scp nadpisuje pliki, jeśli mamy uprawnienia do zapisu.
gzip
przykład:
ssh -t user@hostname 'gzip -c large_logs.txt' | gzip -cd
Narzędzie do kompresji pliku z opcją wypisania go na standardowe wyjście -c. Opcja zalecana przed przesłaniem pliku przez SSH, w celu zmniejszenia transferu.
[z]cat Podstawowe polecenie do wyświetlenia zawartości pliku [plików] na standardowym wyjściu. Z prefiksem z wspiera pliki skompresowane (np. zcat logs.gz). Wraz z innymi poleceniami z prefiksem z może ono korzystać z katalogu /tmp do wykonania operacji, a podobnie jak inne polecenia obsługuje także wzorce glob.
[z]diff Porównuje pliki linia po linii i wspiera wiele parametrów. Jeśli chcesz porównać linie niezależnie od ich kolejności w pliku lub obiekty JSON, to narzędzie może być niewystarczające. AWK i Jq będą tutaj bardziej pomocne.
[z][e|f]grep
przykład (zignoruj wielkość liter, dołącz 10 poprzedzających i 20 następujących wierszy):
zgrep -i -B 10 -A 20 'error' logs.gz
Jest to prawdopodobnie najpopularniejsze narzędzie do przeszukiwania pliku w poszukiwaniu wzorca w linii. Różnice między odmianami Grep są subtelne:
  • fgrep/grep -F – nie rozpoznaje wyrażeń REGEX;
  • egrep/grep -E – rozpoznaje i nie wymaga znaków ucieczki dla wyrażeń REGEX;
  • grep – rozpoznaje i wymaga znaków ucieczki dla wyrażeń REGEX.
[z]less Podobnie do [z]cat – wyświetla zawartość pliku, ale w formacie mieszczącym się na ekranie. Program umożliwia przewijanie i udostępnia wiele dodatkowych poleceń. Jest przydatny do przeszukiwania w locie, np. zapytania na podstawie identyfikatora klienta, a następnie wyszukania powiązanej odpowiedzi nieznaną liczbę linii dalej. W przypadku wielu plików można to zrobić w następujący sposób:
  1. zless 2020-01-0[1-9].log.gz.
  2. Naciśnij ESC, wpisz /fraza, wciśnij Enter.
  3. Naciśnij ESC, a następnie n w celu ponowienia.
[z(1)(2)]head
[z]tail
Te dwa polecenia pokazują pierwsze/ostatnie -n linii pliku. Mogą się przydać do szybkiego sprawdzenia dat logów dla nienazwanych/łączonych plików.
cut
przykłady (1. wypisze b, 2.: b c):
echo "a b c" | cut -d" " -f2
echo "a b c" | cut -d" " -f2-
Przydatne do wyodrębnienia wybranych kolumn przedzielonych określonym separatorem.
tr
przykład zamieniający abc na dbc:
echo "abc" | tr a d
Narzędzie do zastępowania lub usuwania znaków -d.
sort Podstawowe polecenie do sortowania linii. Obsługuje wiele przypadków, takich jak sortowanie słownikowe -d bądź numeryczne -n.
uniq Po uprzednim posortowaniu usuwa duplikaty, pozwala zliczać wystąpienia -c bądź wyświetlić tylko unikalne linie -u.
xargs
przykład: find /tmp -name log -type f -print | xargs /bin/rm -f
Pozwala na budowanie poleceń ze standardowego wejścia, co jest jednym ze sposobów automatyzacji sytuacji opisanej przy poleceniu zless.
split
Używane do dzielenia plików tekstowych na mniejsze na podstawie liczby wierszy -l lub rozmiaru -b (np. split log.txt -b 200 MB).
sed
awk
jq
Te trzy narzędzia są bardziej złożone i wykorzystywane są do przetwarzania danych dlatego, nie będę tutaj ich szczegółowo omawiał.
Sed jest edytorrem strumieniowy, który udostępnia łatwy sposób przekształcania linii tekstowych – sed 's/przed/po/g' log.txt jest przykładowym zastąpieniem tekstowym.
Awk to właściwie język skryptowy, który rozwiązuje podobne problemy, ale jest znacznie potężniejszy.
Jq zwykle nie jest częścią dystrybucji Linuksa, ale najlepiej sprawdza się w przetwarzaniu plików JSON.
  1. nproc
  2. top
  3. du
  4. free
  5. ps
  6. vmstat
  7. iostat
  8. ls /proc
  9. kill
Ostatnia grupa narzędzi, które mogą nie być tak przydatne dla programistów, ale są krytyczne dla inżynierów wydajności i wsparcia:
  1. Zwraca liczbę dostępnych jednostek przetwarzania – przydatne do zrównoleglania skryptów
  2. Wyświetla użycie zasobów per proces. Naciśnij kilkakrotnie e, aby wybrać oczekiwaną skalę jednostki. Polecenie te pozwala nam sprawdzić, który proces pochłania większość naszych zasobów.
  3. Podaje rozmiary katalogów, -h zmienia jednostki na format czytelny dla człowieka, -a dokłada również inne pliki oprócz katalogów.
  4. Wyświetla wolną i używaną pamięć – za pomocą -h w formacie czytelnym dla człowieka. Jest to szybki sposób na sprawdzenie, czy nie zaczyna nam brakować pamięci.
  5. Przedstawia zrzut aktualnie uruchomionych procesów, bardziej szczegółowy za pomocą parametrów -aux.
  6. Zwraca statystyki pamięci wirtualnej (parametr 1 włącza ciągłe raportowanie), przydatne do rozpoczęcia analizy wydajności – wykrycia nadmiernego przełączania kontekstu lub zweryfikowania czasu spędzonego w przestrzeni użytkownika.
  7. Pseudo-system plików, który zapewnia interfejs dla struktur danych jądra. Na tej podstawie plików w tym katalogu możemy wyświetlić przydatne informacje, takie jak cat /proc/cpuinfo.
  8. Przydate polecene kończące proces (identyfikowanym przez id z ps) użycie parametru -9 powinno odbywać się w ostateczności, ponieważ nie daje ono czasu na poprawne zamknięcie procesowi.

Glob

W przypadku większości poleceń, które mogą mieć wiele plików jako danych wejściowych, możesz użyć wzorców glob. Mogą wyglądać podobnie, ale nie myl ich z REGEX-em. Te wzorce używają wieloznaczników *, ? i […] ułatwiają nam nieco życie. Są przydatne w przypadku serwerów z wieloma węzłami, szczególnie gdy mamy zamontowany katalog współdzielony lub ogólnie, gdy chcemy po prostu przeszukiwać wiele plików.

Potoki i przekierowania

Każdy program uruchamiany w powłoce może mieć 3 strumienie STDIN, STDOUT i STDERR. Następujące symbole pozwalają na:

  • > przekierowanie wyjścia do pliku;
  • >> dopisanie wyjścia do pliku;
  • < ustawienie wejścia z pliku;
  • 2> przekierowanie błędów do pliku;
  • | przekierowanie wyjścia do innego programu.

Historia

Ostatnia wskazówka dla sytuacji, w których mamy wiele środowisk z różnymi aplikacjami i zapomnieliśmy danej komendy bądź lokalizacji katalogu, w którym przechowywane są logi. Zazwyczaj historia Basha jest zapisywana w pliku ~/.bash_history i jest dostępna za pomocą polecenia history. Możesz ją sprawdzić pod kątem ostatnich poleceń i poszukać czegoś, co brzmi znajomo.

Podsumowanie

Nauka narzędzi uniksowych na pewno nie pójdzie na marne. Liczba sytuacji, w których mogą się przydać, jest ogromna i obejmuje:

  • wyciąganie szczegółów z logów na podstawie jakiegoś identyfikatora/błędu/daty;
  • pobieranie logów ze zdalnego serwera w celu ich lokalnego przetworzenia do raportu;
  • przetwarzanie danych do pożądanego formatu;
  • porównywanie dwóch plików i weryfikacja zgodności;
  • przygotowywanie prostych statystyk (np. liczby błędów per typ);
  • szybkie przeszukiwanie skompresowanych plików bez konieczności ich rozpakowywania i dzielenia na mniejsze;
  • wyświetlanie części pliku, który może być trudny do załadowania na raz w edytorze;
  • agregowanie logów z różnych usług/węzłów/serwerów;
  • radzenie sobie w środowiskach bez dostępu do zaawansowanych narzędzi.

Jeśli w swoich działaniach zauważysz, że powtarzasz niektóre sekwencje poleceń, może to być dobry moment na ich automatyzację bądź wyodrębnienie do jednego skryptu.