Linux Tutorial: Podtrzymywanie procesów z narzędziem Supervisor
Zapewnienie ciągłości pracy naszej aplikacji to konieczność jeżeli chcemy świadczyć usługi na wysokim poziomie i nie odstraszyć potencjalnych nowych użytkowników. Ze względu na to, że nowoczesne aplikacje tworzone są w idei mikro-usług, utrzymanie ciągłej dostępności może się okazać nie lada wyzwaniem. Wspomniane mikro-usługi mogą bowiem funkcjonować w odrębnych środowiskach, komunikując się za pomocą wszelakich protokołów.
Co jeżeli nagle jedna z usług przestanie działać?
W najlepszym wypadku część funkcjonalności naszego serwisu będzie niedostępna. W najgorszym, gdy jest to usługa pełniąca rolę rdzenia aplikacji, cały serwis stanie przed użytkownikami okoniem.
Jak stale podtrzymywać działanie procesów w systemach z rodziny UNIX/Linux?
Z odsieczą przybywa narzędzie Supervisor, czyli:
aplikacja typu klient/serwer, które pozwala użytkownikom na monitorowanie i zarządzanie procesami w systemach UNIX/Linux.
Źródło: supervisord.org
Krótko mówiąc, Supervisor działa jako master process, sprawując pieczę nad procesami mu podległymi. Jeżeli jeden z monitorowanych procesów zostanie zniszczony, zadaniem Supervisor będzie jego ponowne uruchomienie. Dodatkowo w przypadku większości dystrybucji, usługa narzędzia Supervisor domyślnie rozpocznie działanie wraz ze startem systemu.
Wstęp
W niniejszym artykule opiszę sposób instalacji narzędzia Supervisor i przedstawię przykład jego zastosowania w kontekście aplikacji webowych.
Instalacja narzędzia Supervisor
Przejdź do wiersza poleceń i wykonaj poniższe instrukcje:
$ sudo easy_install supervisor
Jeżeli powyższe polecenie zakończy się komunikatem:
bash: easy_install: command not found
Konieczną będzie instalacja python-setuptools. W systemie Debian/Ubuntu instalację przeprowadzimy za pomocą poniższego polecenia:
$ sudo apt-get install python-setuptools
Domyślna konfiguracja narzędzia Supervisor powinna znajdować się w lokalizacji /etc/supervisor/supervisord.conf (w przypadku systemów Debian/Ubuntu) i z niej będziemy korzystać w tym artykule. Przejdź tutaj, aby poznać inne domyślne ścieżki.
Dodawanie grup procesów
Za pomocą edytora nano otwieramy plik konfiguracyjny:
$ sudo nano /etc/supervisor/supervisord.conf
Na samym końcu pliku dodajemy poniższą zawartość (zwaną grupą procesów):
[program:myprog]
command=mycommand
directory=/myworkdir
autostart=true
stderr_logfile=/mylogdir/mylogfile
W przypadku powyższych ustawień nasza grupa procesów nazywać się będzie myprog.
Objaśnienie parametrów
Parametr | Opis |
---|---|
command | Polecenie, które ma zostać wykonane kiedy nasz program wystartuje. |
directory | Katalog, w którym ma zostać wykonane polecenie zdefiniowane za pomocą parametru command. |
autostart | Wskazuje czy program w grupie ma być uruchomiony po starcie narzędzia Supervisor. |
stderr_logfile | Lokalizacja, do której będą zapisywane informacje o błędach. |
Przykład implementacji
Narzędzie supervisor możemy sukcesywnie stosować do podtrzymywania procesów wydobycia kryptowalut, kolejek zadań czy skryptów w Node.js.
W moim przykładzie posłużę się tym ostatnim. Poniżej zamieszczam kod niezwykle prostego skryptu serwera HTTP.
Uwaga! Aby poniższy kod został wykonany, konieczna będzie instalacja Node.js. Przejdź tutaj aby dowiedzieć się więcej.
var http = require('http');
var server = http.createServer(function(req, res) {
res.writeHead(200);
res.end('Hello World!');
});
server.listen(8080);
Aby uruchomić serwer, wykonaj poniższe polecenie:
$ node /mypath/myapp.js
Zweryfikuj czy serwer HTTP działa, przechodząc pod adres http://localhost:8080 (dla maszyny lokalnej).
Następnie zamknij proces klikając Ctrl+c w oknie wiersza poleceń z aktywnym procesem node.
Dodaj nową grupę procesów do konfiguracji supervisord.conf:
[program:myapp]
command: node myapp.js
directory: /myworkdir
autostart=true
stderr_logfile=/mylogdir/myapp.log
Uruchom ponownie usługę supervisord:
$ sudo service supervisor restart
Sprawdź czy nasz proces uruchomił się:
$ ps ax | grep node
Powinieneś zobaczyć informację podobną do poniższej:
23619 ? Sl 0:00 node myapp.js
Spróbujmy zniszczyć proces:
$ sudo kill -9 23619
Wykonajmy polecenie ps ax | grep node raz jeszcze. Rezultat jaki powinniśmy uzyskać to:
24848 ? Sl 0:00 node myapp.js
Nasz skrypt wciąż działa! Od tej pory możemy być spokojni o ciągłość jego pracy!
You got a 3.76% upvote from @allaz courtesy of @piotr42!
Congratulations! This post has been upvoted from the communal account, @minnowsupport, by piotr42 from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, theprophet0, someguy123, neoxian, followbtcnews, and netuoso. The goal is to help Steemit grow by supporting Minnows. Please find us at the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.
If you would like to delegate to the Minnow Support Project you can do so by clicking on the following links: 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP.
Be sure to leave at least 50SP undelegated on your account.
O! Tego właśnie szukałem, bo z niewiadomego powodu umierają mi apki PHP na serwerze deweloperskim. Dzięki za artykuł.
Cieszę się, że mogłem pomóc @jarric :) Pozdrawiam!