Do zarządzania procesorami w systemie Linux służą systemy inicjalizacji, takie jak systemd. Jeśli potrzebujesz prostszego rozwiązania, program, który może zarządzać procesami aplikacji, albo w systemie, albo w kontenerze Docker. Taki program istnieje - jest nim supervisor. Jest to funkcjonalnie prosty menedżer procesów open-source napisany w Pythonie, który może być używany do uruchamiania dowolnej liczby kopii procesu i monitorowania ich stanu. Poniżej pokażemy jak zainstalować i skonfigurować Supervisor na przykładzie Ubuntu 20.04.
Najprostszym sposobem na uzyskanie programu jest zainstalowanie go z oficjalnych repozytoriów. Aby to zrobić, należy uruchomić polecenie:
$ sudo apt install supervisor
Jeśli chcesz, aby program działał cały czas, musisz dodać go do autoloadera i uruchomić. Wykonaj:
$ sudo systemctl enable supervisor --now
Następnie można wyświetlić status za pomocą polecenia:
$ sudo systemctl status supervisor
Plik konfiguracyjny znajduje się pod adresem /etc/supervisor/supervisord.conf.
Jest to również miejsce, w którym znajdują się podstawowe ustawienia. Do konfiguracji uruchomionych procesów lepiej jest użyć katalogu /etc/supervisor/conf.d/.
Główny plik konfiguracyjny można pozostawić domyślnie. Zobaczmy, jak tworzyć pliki konfiguracyjne dla programów. Składnia sekcji dla pojedynczego procesu wygląda następująco:
nazwa zmiennej wartość
Dla każdego procesu konieczne jest przekazanie takich zmiennych, aby automatycznie uruchamiał się i odzyskiwał po awarii:
directory
- katalog roboczy;
command
- polecenie uruchomienia procesu; user
- użytkownik, w imieniu którego proces zostanie uruchomiony;
autostart
- czy proces ma być uruchamiany automatycznie; autorestart
- czy proces powinien zostać uruchomiony ponownie;
Dostępnych jest jednak znacznie więcej ustawień, oto niektóre z nich, które zostaną omówione w tym artykule:
priority
- priorytet procesu, który ma zostać uruchomiony;
environment
- zmienne środowiskowe przekazywane do procesu;
stdout_logfile
- gdzie przekierować wyjście stdout procesu;
stderr_logfile
- gdzie przekierować wyjście stderr procesu; process_name
- nazwa procesu, z możliwością podstawienia numeru kopii;
numprocs
- liczba kopii procesu do uruchomienia;
startretries
- liczba prób uruchomienia programu;
redirect_stderr
- przekierowanie wyjścia błędu procesu na wyjście nadzorcy;
redirect_stdout
- przekierowanie wyjścia procesu na wyjście nadzorcy.Dla lepszego zrozumienia i przykładu, wykonajmy skrypt PHP, który po prostu zawiesi się w tle:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Dla procesu można utworzyć osobny plik konfiguracyjny nadzorcy. Możesz wstawić konfigurację na samym końcu głównego pliku konfiguracyjnego, ale lepiej tego nie robić. Lepiej jest utworzyć oddzielny plik konfiguracyjny dla każdego programu w /etc/supervisor/conf.d/
z nazwą *.conf. Na przykład dla tego programu plik ten będzie wyglądał następująco:
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
Następnie należy zrestartować supervisor, można to zrobić za pomocą systemctl:
$ sudo systemctl restart supervisor
lub za pomocą narzędzia supervisorctl
:
$ sudo supervisorctl reload
Można również zobaczyć status skonfigurowanych procesów za pomocą polecenia:
Jeśli proces ma status RUNNING, to wszystko jest w porządku i został pomyślnie uruchomiony. Ale w tym przypadku proces jest uruchomiony w pojedynczej instancji, a dość często trzeba uruchomić wiele kopii tego samego procesu. W tym celu możemy użyć parametrów process_name
i numprocs
. Pierwszy z nich pozwala zmodyfikować nazwę procesu tak, aby zawierała numer kopii, a drugi pozwala określić, ile kopii powinno zostać uruchomionych.
Zmienna process_name
zwykle zawiera wzorzec formatowania ciągów znaków Pythona, który zawiera nazwę programu i numer procesu: %(nazwa_programu)s_%(numer_procesu)02d
. Tutaj nazwa zmiennej znajduje się w nawiasach, a po niej jej typ. Na przykład, aby uruchomić ten sam program w czterech wątkach, plik konfiguracyjny powinien mieć taką postać:
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
Teraz musimy ponownie załadować supervisorctl
i będą uruchomione 4 procesy:
$ sudo supervisorctl status
Jednocześnie możliwe jest zapisywanie wszystkich danych wyjściowych programu do pliku dziennika. Do tego celu służą parametry stdout_logfile
i stderr_logfile
. Na przykład, można wyprowadzić plik dziennika jego wykonania bezpośrednio w folderze z programem.
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
stdout_logfile=/home/sergiy/program/process.log
stderr_logfile=/home/sergiy/program/process.log.error
Po ponownym uruchomieniu usługi dzienniki pojawią się w folderze z programem:
Podobnie, jeśli chcesz przekierować wyjście swoich procesów na standardowe wyjście nadzorcy, powinieneś użyć parametrów redirect_stderr
i redirect_stdout
. Jeśli program wymaga zmiennych środowiskowych, można je przekazać za pomocą parametru environment. Zmienne powinny być zapisywane z przecinkami. Na przykład:
$ environment=DISPLAY=":1",HOME="/root"
Po każdej zmianie konfiguracji należy pamiętać o ponownym uruchomieniu programu supervisor w celu zastosowania zmian. Narzędzie supervisorctl może być używane do kontrolowania procesów. Jak już zauważyłeś, aby zobaczyć listę procesów, musisz je wykonać:
$ sudo supervisorctl status
Następnie, znając nazwę procesu, można go ponownie uruchomić, na przykład process:process_00
:
$ sudo supervisorctl restart process:process_00
Stop:
$ sudo supervisorctl stop process:process_00
Lub uruchomić:
$ sudo supervisorctl start process:process_00
Alternatywnie można połączyć się z procesem i zobaczyć, co wypisuje do stdout/stderr
za pomocą polecenia fg
:
$ sudo supervisorctl fg process:process_00
Przyjrzeliśmy się, jak skonfigurowany jest supervisor
i jak korzystać z oprogramowania do zarządzania procesami.