wtorek, 22 marca 2022

PowerShell: Monitorowanie stanu usługi w konsoli i do pliku

W celu rozwiązywania problemu z jakąś usługą, może się przydać prosty monitoring polegający na sprawdzaniu jej statusu w podanym interwale czasowym.

Poniższy jednolinijkowiec wykonuje takie właśnie zadanie.

$serviceName = 'nazwa_usługi'; while ($TRUE) {start-sleep -Seconds 5; write-output "$(get-date -format "HH:mm:ss") : $((get-service -name $serviceName).Name) : $((get-service -name $serviceName).Status)"}

W powyższym kodzie proszę zwrócić uwagę na miejsca oznaczone na czerwono. Oczywiście 'nazwa_uslugi' to nic innego jak nazwa usługi, którą chcemy monitorować (nazwy usług można podejrzeć np. poleceniem Get-Service).

Z kolei cyfra 5 oznacza interwał czasowy w sekundach pomiędzy sprawdzeniami. 

Rezultat jego działania widać poniżej. 


Oczywiście monitorowanie na ekranie może się przydać we w miarę krótkim przedziale czasowym. Jeżeli zachodzi potrzeba monitoringu dłuższego okresu czasu, wystarczy rezultat powyższej komendy przekierować do pliku dodając kod, który zamieściłem poniżej na czerwono.

$serviceName = 'spooler'; while ($TRUE) {start-sleep -Seconds 5; write-output "$(get-date -format "HH:mm:ss") : $((get-service -name $serviceName).Name) : $((get-service -name $serviceName).Status)" | Tee-Object -file plik.txt -append}

poniedziałek, 21 marca 2022

PowerShell: Przeszukiwanie plików w folderze (i ewentualnie podfolderach) pod kątem określonego ciągu znaków

Informacje wstępne

Poniżej wklejam prostą komendę w PowerShellu, która pozwoli przeszukać wszystkie pliki tekstowe w folderze pod kątem podanego ciągu znaków. 

Przydatne zwłaszcza kiedy w gąszczu logów trzeba znaleźć określoną frazę.

Komenda

Wersja przeszukująca wszystkie pliki w folderze

Get-ChildItem -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}

Wersja z ograniczeniem przeszukiwania do plików *.txt

Get-ChildItem *.txt -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}

Wersja z ograniczeniem przeszukiwania do plików *.txt i rekursywnym przeszukiwaniem podfolderów

Get-ChildItem *.txt -Recurse -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}

Przykład działania

Do przeszukania poszły dwa pliki. Pierwszy ze słowami angielskimi, drugi z polskimi:

  • english_words_alpha.txt (link)
  • sjp.20220320.txt (link)
Obydwa znajdowały się w jednym folderze i chciałem w nich wyszukać wszelkie kombinacje mojego imienia, tj. "daniel". 

Użyłem komendy, która została podana powyżej, zaś poniżej screen przedstawiający rezultat obejmujący:
  • kolumna pierwsza: nazwa pliku,
  • kolumna druga: nr wiersza w którym ciąg został znaleziony,
  • kolumna trzecia: odnaleziony ciąg z wyróżnieniem szukanego tekstu.

Parsowanie plików w folderze pod kątem określonego ciągu
Wynik działania opisywanej komendy w PowerShellu

No i to w sumie tyle. Jedna linijka, a potrafi zaoszczędzić dużo czasu :)