NSSM – fajne narzędzie do zarządzania serwisami

NSSM to skrót od Non-Sucking Service Manager i to właściwie bardzo dobre podsumowanie tego narzędzia. Znajdziemy je tutaj.

Dlaczego jest takie fajne?

Ponieważ pozwala nam na łatwe zarządzanie serwisami bez używania takich komend jak installutil czy sc. Mimo, że używamy go z konsoli dostarcza nam okienkowego interfejsu w którym możemy ustawić poszczególne opcje dla naszego serwisu.

Zatem jak tego używać?

Powiedzmy że stworzyliśmy serwis Windowsowy lub też jakiś inny (osobiście używam NSSM na przykład do instalowania serwisów wchodzących w skład ELK – Elasticsearch, Logstash, Kibana) i nazywa się on myservice.exe

Ściagąmy NSSM stąd, rozpakowujemy w dowolnym miejscu i aby wygodniej go używać dodajmy go sobie do PATH. Tak przygotowani otwórzmy konsolę z prawami administratora i przejdźmy do folderu, gdzie znajduje się myservice.exe

Możemy tutaj wyświetlić sobie opcje jakie daje nam nssm poleceniem

nssm --help

lub samo

nssm

Pierwsza opcja dostępna to:

To show service installation GUI:
nssm install []

Ta bardzo mi się podoba, ponieważ pokazuje nam ona takie oto okienko:

NSSM

W zakładce Application możemy ustawić ścieżkę do naszego serwisu w polu Path oraz argumenty z jakimi ma być uruchamiany serwis. Na tym możemy zakończyć klikając „Install service” jednak możliwe jest też użycie wielu innych opcji. Najciekawsze z nich omówię poniżej.

W zakładce Details mamy możliwość ustawienia nazwy i opisu jakie mają być wyświetlana w systemie dla tego serwisu – np. w  systemowych usługach oraz opcji „Startup type” czyli czy serwis ma być uruchamiany automatycznie, ręcznie albo ma pozostać nieuruchomiony.

nssm-details

W zakładce Log on ustawiamy parametry konta, którego ma używać serwis.

nssm-logon

Z kolei w zakładce Dependencies możemy ustawić serwisy od których nasz ma być uzależniony.

nssm-dependencies

W praktyce oznacza to, że jeśli np nasz serwis wymaga do działania jakiegoś innego dobrze jest umieścić go właśnie w tych zależnościach aby serwisy razem się uruchamiały i razem resetowały. Unikniemy wtedy sytuacji, że jeden się wyłączy i drugi przestanie działać z powodu tamtego.

Zakładka Process pozwala nam ustawić parametry dotyczące priorytetów tego serwisu oraz jakiej ilości rdzeni ma używać. Parametry dotyczące wyłączenia serwisu ustawiamy w zakładce Shutdown a to co ma się dziać w razie wystąpienia problemów w zakładce Exit Actions.

nssm-process

W zakładce I/O możemy podać ścieżki do plików, gdzie zostaną umieszczone logi z działania serwisu takiego jak uruchamianie czy jakieś problemy. Trzeba pamiętać, że nie jest to ta sama ścieżka co np logowanie do plików za pomocą log4net, którą konfigurujemy całkiem gdzie indziej.

nssm-io

Z logami powiązana jest również kolejna zakładka, która umożliwia nam ustawienie według jakich reguł pliki mają być podmieniane.

nssm-filerotation

I wreszcie ostatnia zakładka umożliwia nam zdefiniowanie zmiennych środowiskowych właściwych dla tego serwisu jeśli ich wymaga.

nssm-environment

Jak widać NSSM dostarcza nam w sposób bardzo przyjazny potężny zbiór różnego rodzaju ustawień, które oczywiście możemy konfigurować też na parę innych sposobów:

  • konfiguracja podczas tworzenia np. w Visual Studio
  • polecenie installutil podczas instalacji serwisu
  • Usługi (Services)

Jednak tutaj mamy tą przewagę, że wszystkie ustawienia zebrane są w jednym miejscu i wygląda to bardzo czytelnie i wygodnie.

Podobne okienko zobaczymy, gdy zechcemy edytować serwis poleceniem

nssm edit

Jednak jeśli bardzo chcemy możemy też nie używać okienka i po prostu korzystać nadal z linii poleceń, ale wtedy oczywiście wszystkie parametry wpisujemy ręcznie. Służą do tego celu komendy:

nssm install <servicename> <app> [<args> ...]

do instalacji

Oraz

nssm set <servicename> <parameter> [<subparameter>] <value>

do ustawienia poszczególnych parametrów serwisu

Dla mnie największą zaletą NSSM jest to, iż radzi sobie ze wszelkim przywieszonymi serwisami, które do końca się nie uruchomiły a których pid wynosi 0 przez co nie da się ich pozbyć za pomocą polecenia taskkill. Takie sytuacje często zdarzają się podczas pracy nad windowsowymi serwisami.

Wystarczy wówczas uruchomić usuwanie albo korzystając z okienka za pomocą polecenia:

nssm remove [<servicename>]

i wówczas otworzy się okienko

Albo po prostu wywołać polecenie:

nssm remove <servicename> confirm

I NSSM szybko pozbywa się naszego serwisu bez konieczności resetowania maszyny by pozbyć się przywieszonego serwisu.

Oprócz wspominanych opcji instalowania i usuwania serwisów mamy też inne:

Edycję:
To show service editing GUI:
nssm edit

Modyfikację poszczególnych parametrów bądź sprawdzenie ich wartości:

To retrieve or edit service parameters directly:
nssm get []
nssm set []
nssm reset []

Zarządzanie serwisami:

To manage a service:
nssm start
nssm stop
nssm restart
nssm status
nssm rotate