Narzędzia linuxowe – podstawy programisty
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.
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):
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:
Polecenia | Opis |
---|---|
ssh user@hostname
The authenticity of host (...) can't be established. |
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:
|
[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:
|
[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. |
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:
|
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.