[PYTHON] Mit Supervisor einfach zu dämonisieren

Was du machen willst

Möglicherweise möchten Sie es als Daemon-Prozess ausführen, z. B. als Skript, das Sie ständig starten möchten. Zum Beispiel, wenn Sie das Skript von /etc/init.d selbst schreiben ...

Mit anderen Worten, es sollte ungefähr gleich sein ** "Es ist mühsam, ein Prozessverwaltungsskript zu schreiben" ** Wenn Sie es als Dienst registrieren, ist es ** "Grundsätzlich Start / Stopp-Verwaltung als Root" **, also Sie möchten diese beiden vermeiden.

Mit systemd müssen Sie kein Skript schreiben,

Ich denke, auch in solchen Fällen besteht Nachfrage.

deamonize tool

Für diese Art von Problem müssen Sie ein Dämonisierungstool verwenden. Daemontools oder für immer. Hier werde ich den in Python implementierten "Supervisor" verwenden. Weil es stabil ist.

supervisor

Als Test

Installation

Es gibt zwei Hauptmethoden.

  1. Installieren Sie aus dem EPEL-Repository
  2. Verwenden Sie den Python-Paketmanager (pip / easy_install).

Methode 1 ist möglicherweise veraltet. Wenn Sie die neueste Version verwenden möchten, verwenden Sie Methode 2.

1. Bei der Installation von EPEL

yum install supervisor
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm -ivh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

2. Verwenden Sie pip / easy_install.

Bei der Installation über einen Python-Paketmanager wie pip / easy_install Im Gegensatz zur Installation aus dem EPEL-Repository enthält es standardmäßig keine Dienstverwaltung für Supervisord. Es ist eine gute Idee, dies manuell zu tun.

sudo easy_install supervisor

#Oder

sudo pip install supervisor

Wenn Sie den Python-Paketmanager überhaupt nicht haben Um easy_install zu verwenden, verwenden Sie "sudo yum install python-setuptools". Um pip zu verwenden, führen Sie nach der Installation von easy_install sudo easy_install pip aus.

Eine EPEL-Repository-Installation platziert sie automatisch in /etc/supervisord.conf, generiert sie jedoch manuell.

sudo echo_supervisord_conf > /etc/supervisord.conf

/Etc/supervisord.d wird automatisch von der EPEL-Repository-Installation generiert. Erstellen Sie es daher.

sudo mkdir /etc/supervisord.d

Nehmen Sie Anpassungen an der Protokolldatei vor, die das Supervisord-Hauptgerät ausspuckt. Die Standardkonfiguration ist /tmp/supervisord.log Ändern Sie /etc/supervisord.conf in /var/log/supervisor/supervisord.log.

[supervisord]
#Protokollverzeichnis
;logfile=/tmp/supervisord.log
logfile=/var/log/supervisor/supervisord.log

Erstellen Sie ein Zielverzeichnis für die Protokollausgabe und legen Sie die Protokollrotation fest.

sudo mkdir /etc/supervisord.d
sudo sh -c "echo '/var/log/supervisor/*.log {
       missingok
       weekly
       notifempty
       nocompress
}' > /etc/logrotate.d/supervisor"

Ändern Sie auch /etc/supervisord.conf. Die PID-Datei sollte unter / var / run / generiert werden Ermöglicht das Einfügen von Konfigurationsdateien unter /etc/supervisord.d/.

[supervisord]
# ...Unterlassung
#PID-Datei
;pidfile=/tmp/supervisord.pid
pidfile=/var/run/supervisord.pid

# ...Unterlassung

#Der Include-Abschnitt wurde auskommentiert. Kommentieren Sie ihn daher ein und ändern Sie ihn für Folgendes:
[include]
files = supervisord.d/*.ini

Es scheint, dass einige Leute das Init-Skript erstellt haben. Wir danken Ihnen, dass Sie es verwendet haben. https://github.com/Supervisor/initscripts

Es werden verschiedene Arten von Distributionen unterstützt, aber dieses Mal werde ich Folgendes verwenden.

https://github.com/Supervisor/initscripts/blob/master/redhat-init-equeffelec


sudo curl -o /etc/rc.d/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec
sudo chmod 755 /etc/rc.d/init.d/supervisord
sudo chkconfig --add supervisord

In CentOS7 wird es in systemd registriert. Erstellen Sie die systemd-Einheitendatei unter Bezugnahme auf Folgendes.

https://github.com/zokeber/supervisor-systemd/blob/master/etc/systemd/system/supervisord.service

Speichern Sie es in /etc/systemd/system/supervisord.service mit den folgenden Inhalten.

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]
WantedBy=multi-user.target

Überprüfen Sie nach dem Erstellen die Verwaltungsregistrierung für systemd mit systemctl list-unit-files --type = service und versuchen Sie, sie zu starten.

systemctl start supervisord
systemctl status supervisord
systemctl stop supervisord

Wenn es kein Problem gibt, registrieren Sie sich für den automatischen Start.

systemctl enable supervisord.service

Supervisord-Konfiguration

[inet_http_server]
port=127.0.0.1:9001

[supervisorctl]
serverurl=unix:///var/tmp/supervisor.sock
serverurl=http://127.0.0.1:9001

Registrierung des Prozessmanagements

Der von mir installierte Supervisor ist die Version 3-Serie, und die Konfiguration scheint sich geringfügig von der 2-Serie zu unterscheiden. Besonders um die Protokollausgabe. (2 Serien sind alt, also verwenden wir 3 Serien)

Unten ist das Standardausgabeprotokoll-Speicherverzeichnis für Jobs auf "/ var / log / Supervisor / jobs" festgelegt. Wenn Sie es so verwenden möchten, wie es ist, erstellen Sie es im Voraus. Außerdem sind die folgenden Rotationseinstellungen angemessen.

[program:GrowthForecast]
command=/usr/local/bin/growthforecast.pl --enable-float-number --data-dir /data/gf    ;Befehl starten
user=monadmin  ;Benutzer starten
autorestart=true  ;Automatischer Neustart, wenn der Prozess ausfällt
stdout_logfile=/var/log/supervisor/jobs/GrowthForecast-supervisord.log ;Standardausgabeprotokoll
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=5
stdout_capture_maxbytes=1MB
redirect_stderr=true  ;Fehlerausgabe auf Standardausgabe umleiten

Erstellen Sie dies auch in /etc/supervisord.d/GrowthForecast.ini.

[program:HRForecast]
command=perl hrforecast.pl --config config.pl  ;Der relative Pfad vom Verzeichnis ist in Ordnung.
user=monadmin
directory=/opt/HRForecast  ;Wenn Sie ein Installationsverzeichnis haben, klicken Sie hier.
autorestart=true
stdout_logfile=/var/log/supervisor/jobs/HRForecast-supervisord.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=5
stdout_capture_maxbytes=1MB
redirect_stderr=true

Erstellen Sie dies auch in /etc/supervisord.d/HRForecast.ini.

Bestätigung starten

sudo service supervisor start

Es ist eine gute Idee, die Protokolle unter / var / log / Supervisor zu überprüfen. Mit dieser Einstellung wird auch der Standard / Fehler des festgelegten Prozesses (GrowthForecast oder HRForecast) angezeigt.

Versuchen Sie nach dem Start, den Clientbefehl Supervisorctl von einer anderen Person als root zu drücken. Drücken Sie es alleine, um die Befehlszeilenverwaltungsoberfläche aufzurufen. Wenn es also erfolgreich ist, sieht es so aus:

[monadmin@myhost]% supervisorctl
GrowthForecast                   RUNNING    pid 24955, uptime 0:12:00
HRForecast                       RUNNING    pid 24956, uptime 0:12:00
supervisor>

Starten Sie über die CLI-Konsole|stop|restart [Vorgangsname]、 Eine Liste der Verwaltungsprozesse wird im Status angezeigt.

Supervisorctl ohne Eingabe der CLI-Konsole{start|stop|restart|status} [Vorgangsname]Usw. sind möglich.

Sie können es tun, ohne Wurzel zu werden, Sie haben jetzt einen Daemon, den Sie auf Benutzerebene verwalten können.

Wenn du verlierst

[monadmin@myhost]% supervisorctl
GrowthForecast                   FATAL      can't find command 'growthforecast.pl'
HRForecast                       RUNNING    pid 8136, uptime 0:00:29
supervisor>

Wenn der Start fehlschlägt, lautet der Status FATAL. Aus diesem Grund habe ich einen Befehl geschrieben, der den Pfad nicht durchläuft.

Was ich nicht getan habe & andere

Recommended Posts

Mit Supervisor einfach zu dämonisieren
Machen Sie einfach einen Piepton mit Python
Mit Python mit Kelch ganz einfach ohne Server
Schreiben Sie einfach if-elif mit Lambda
Erstellen Sie einfach CNNs mit Keras
Einfach cProfile mit einem Dekorateur
Implementieren Sie einfach Unterbefehle mit Python-Klick
Einfache Handhabung von Listen mit Python + SQLite3
Wechseln Sie pyenv virtualenvs ganz einfach mit peco
Erstellen Sie mit Vagrant ganz einfach virtuelle Maschinen
Mit Python 3 einfach auf Twitter posten
Senden Sie mit Django ganz einfach E-Mails mit Google Mail
Zeichnen Sie einfach eine Karte mit matplotlib.basemap
Erstellen Sie mit Laragon ganz einfach eine Entwicklungsumgebung
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Probieren Sie ganz einfach die automatische Bilderzeugung mit DCGAN-Tensorfluss aus
Implementieren Sie die inkrementelle ItemView-Suche einfach mit PySide
Laden Sie einfach mp3 / mp4 mit Python und youtube-dl herunter!