Für die Verwaltung von Prozessoren in Linux gibt es Initialisierungssysteme wie systemd. Wenn Sie eine einfachere Lösung benötigen, ein Programm, das die Prozesse Ihrer Anwendung verwalten kann, entweder auf dem System oder in einem Docker-Container. Ein solches Programm gibt es - es ist supervisor. Es ist ein funktionell einfacher Open-Source-Prozessmanager, der in Python geschrieben wurde und mit dem Sie so viele Kopien eines Prozesses wie nötig ausführen und deren Zustand überwachen können. Im Folgenden zeigen wir Ihnen, wie Sie Supervisor am Beispiel von Ubuntu 20.04 installieren und konfigurieren.
Der einfachste Weg, das Programm zu bekommen, ist, es aus den offiziellen Repositories zu installieren. Dazu müssen Sie den Befehl ausführen:
$ sudo apt install supervisor
Wenn Sie möchten, dass das Programm immer läuft, müssen Sie es zu Ihrem Autoloader hinzufügen und ausführen. Ausführen:
$ sudo systemctl enable supervisor --now
Anschließend können Sie den Status über den Befehl anzeigen:
$ sudo systemctl status supervisor
Die Konfigurationsdatei befindet sich unter /etc/supervisor/supervisord.conf.
Hier befinden sich auch die Grundeinstellungen. Für die Konfiguration laufender Prozesse ist es besser, das Verzeichnis /etc/supervisor/conf.d/
zu verwenden .
Die Hauptkonfigurationsdatei kann als Standard belassen werden. Sehen wir uns nun an, wie man Konfigurationsdateien für Programme erstellt. Die Syntax eines Abschnitts für einen einzelnen Prozess sieht wie folgt aus:
Variablenname Wert
Für jeden Prozess müssen solche Variablen übergeben werden, damit er automatisch gestartet und nach einem Absturz wiederhergestellt werden kann:
directory
- Arbeitsverzeichnis;
command
- Befehl zum Starten des Prozesses; user
- Benutzer, in dessen Namen der Prozess gestartet werden soll;
autostart
- ob der Prozess automatisch gestartet werden soll; autorestart
- ob der Prozess neu gestartet werden soll;
Es gibt jedoch noch viele weitere Einstellungen, von denen in diesem Artikel nur einige behandelt werden:
Priorität
- Prioritätdes
zu startenden Prozesses;
environment
- Umgebungsvariablen, die an den Prozess übergeben werden sollen;
stdout_logfile
- wohin die stdout-Ausgabe des Prozesses umgeleitet werden soll;
stderr_logfile
- wohin die stderr-Ausgabe des Prozesses umgeleitet werden soll; process_name
- Prozessname, mit der Möglichkeit, die Kopiennummer zu ersetzen;
numprocs
- Anzahl der Kopien des zu startenden Prozesses;
startretries
- Anzahl der Versuche, das Programm zu starten;
redirect_stderr
- leitet die Fehlerausgabe des Prozesses auf die Ausgabe des Supervisors um;
redirect_stdout
- Prozessausgabe auf die Supervisor-Ausgabe umleiten.Zum besseren Verständnis und als Beispiel führen wir ein PHP-Skript aus, das einfach im Hintergrund läuft:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Sie können eine separate Supervisor-Konfigurationsdatei für den Prozess erstellen. Sie können die Konfiguration direkt am Ende der Hauptkonfigurationsdatei einfügen, aber es ist besser, das nicht zu tun. Es ist besser, für jedes Programm eine eigene Konfigurationsdatei in /etc/supervisor/conf.d/
mit dem Namen *.conf zu erstellen. Für dieses Programm sieht die Datei zum Beispiel so aus:
$ 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
Dann müssen Sie den Supervisor neu starten, dies kann mit systemctl geschehen:
$ sudo systemctl restart supervisor
Oder mit dem Dienstprogramm supervisorctl
:
$ sudo supervisorctl reload
Sie können auch den Status der konfigurierten Prozesse mit dem Befehl sehen:
Wenn der Prozess im Status RUNNING ist, ist alles gut und er wurde erfolgreich gestartet. Aber in diesem Fall läuft der Prozess in einer einzigen Instanz, und oft muss man mehrere Kopien desselben Prozesses laufen lassen. Zu diesem Zweck können wir die Parameter process_name
und numprocs
verwenden. Mit dem ersten können Sie den Prozessnamen so ändern, dass er die Nummer der Kopie enthält, und mit dem zweiten können Sie angeben, wie viele Kopien ausgeführt werden sollen.
Die Variable process_name
enthält normalerweise ein Python-String-Formatierungsmuster, das den Programmnamen und die Prozessnummer enthält: %(program_name)s_%(process_num)02d
. Hier steht der Variablenname in Klammern, gefolgt von seinem Typ. Um zum Beispiel das gleiche Programm in vier Threads laufen zu lassen, sollte die Konfigurationsdatei in dieser Form angelegt werden:
$ 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
Jetzt müssen wir supervisorctl
erneut laden und es laufen 4 Prozesse:
$ sudo supervisorctl status
Gleichzeitig ist es möglich, alle Daten, die das Programm ausgibt, in der Logdatei zu speichern. Dazu werden die Parameter stdout_logfile
und stderr_logfile
verwendet. Sie können zum Beispiel die Protokolldatei der Programmausführung direkt in den Ordner mit dem Programm ausgeben.
$ 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
Nach dem Neustart des Dienstes erscheinen die Protokolle in dem Ordner mit dem Programm:
Wenn Sie die Ausgaben Ihrer Prozesse auf die Standardausgabe des Supervisors umleiten
möchten, sollten Sie die Parameter redirect_stderr
und redirect_stdout
verwenden .
Wenn Ihr Programm Umgebungsvariablen benötigt, können Sie diese mit dem Parameter environment übergeben. Variablen sollten mit Kommas geschrieben werden. Ein Beispiel:
$ environment=DISPLAY=":1",HOME="/root"
Denken Sie daran, supervisor nach jeder Konfigurationsänderung neu zu starten, damit die Änderungen übernommen werden. Das Dienstprogramm supervisorctl kann zur Kontrolle von Prozessen verwendet werden. Wie Sie bereits festgestellt haben, müssen Sie die Liste der Prozesse ausführen, um sie zu sehen:
$ sudo supervisorctl status
Wenn Sie den Namen des Prozesses kennen, können Sie ihn neu starten, zum Beispiel process:process_00
:
$ sudo supervisorctl restart process:process_00
Anhalten:
$ sudo supervisorctl stop process:process_00
Oder starten:
$ sudo supervisorctl start process:process_00
Alternativ dazu können Sie sich mit dem Prozess verbinden und sehen, was er mit dem Befehl fg
in stdout/stderr
ausgibt:
$ sudo supervisorctl fg process:process_00
Wir haben uns angesehen, wie Supervisor
konfiguriert wird und wie man die Prozessverwaltungssoftware verwendet.