[PYTHON] Facilement démonisé avec Supervisor

Chose que tu veux faire

Vous voudrez peut-être l'exécuter en tant que processus démon, tel qu'un script que vous souhaitez démarrer tout le temps. Cependant, par exemple, si vous écrivez vous-même le script de /etc/init.d ...

En d'autres termes, il devrait être à peu près le même ** "Il est difficile d'écrire un script de gestion de processus" ** Si vous l'enregistrez en tant que service, ce sera ** "Fondamentalement, démarrer / arrêter la gestion en tant que root" **, donc Vous voulez éviter ces deux.

Avec systemd, vous n'avez pas besoin d'écrire un script,

Je pense qu'il y a une demande même dans de tels cas.

deamonize tool

Pour ce genre de problème, vous devrez utiliser un outil de démonisation. daemontools ou pour toujours. Ici, j'utiliserai le "superviseur" implémenté en python. Parce que c'est stable.

supervisor

Comme test

Installation

Il existe deux méthodes principales.

  1. Installer à partir du référentiel EPEL
  2. Utilisez le gestionnaire de packages python (pip / easy_install).

La méthode 1 est peut-être obsolète. Si vous souhaitez utiliser la dernière version, utilisez la méthode 2.

1. Lors de l'installation depuis 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. Utilisez pip / easy_install.

Lorsqu'il est installé à partir d'un gestionnaire de packages python tel que pip / easy_install, Contrairement à l'installation à partir du référentiel EPEL, par défaut, il n'inclut pas la gestion des services pour le superviseur lui-même. C'est une bonne idée de le faire manuellement.

sudo easy_install supervisor

#Ou

sudo pip install supervisor

Si vous n'avez pas le gestionnaire de packages python en premier lieu Pour utiliser easy_install, utilisez sudo yum install python-setuptools, Pour utiliser pip, exécutez sudo easy_install pip après avoir installé easy_install.

Une installation de référentiel EPEL le placera automatiquement dans /etc/supervisord.conf, mais le générera manuellement.

sudo echo_supervisord_conf > /etc/supervisord.conf

/Etc/supervisord.d est automatiquement généré par l'installation du référentiel EPEL, alors créez-le.

sudo mkdir /etc/supervisord.d

Faites des ajustements autour du fichier journal que l'unité principale de supervision crache. La configuration par défaut est /tmp/supervisord.log, donc Modifiez /etc/supervisord.conf pour en faire /var/log/supervisor/supervisord.log.

[supervisord]
#Répertoire des journaux
;logfile=/tmp/supervisord.log
logfile=/var/log/supervisor/supervisord.log

Créez un répertoire de destination de sortie du journal, puis définissez la rotation du journal.

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

Modifiez également /etc/supervisord.conf. Le fichier pid doit être généré sous / var / run / Vous permet d'inclure les fichiers de configuration sous /etc/supervisord.d/.

[supervisord]
# ...Omission
#fichier pid
;pidfile=/tmp/supervisord.pid
pidfile=/var/run/supervisord.pid

# ...Omission

#La section include a été commentée, alors commentez-la et modifiez-la pour ce qui suit:
[include]
files = supervisord.d/*.ini

Il semble que certaines personnes aient créé le script init, alors merci de l'avoir utilisé. https://github.com/Supervisor/initscripts

Il prend en charge plusieurs types de distributions, mais cette fois, j'utiliserai ce qui suit.

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

Dans CentOS7, il sera enregistré dans systemd. Créez le fichier d'unité systemd en vous référant à ce qui suit.

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

Stockez-le dans /etc/systemd/system/supervisord.service avec le contenu suivant.

[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

Après l'avoir créé, vérifiez l'enregistrement de gestion dans systemd avec systemctl list-unit-files --type = service et essayez de le démarrer.

systemctl start supervisord
systemctl status supervisord
systemctl stop supervisord

S'il n'y a pas de problème, inscrivez-vous au démarrage automatique.

systemctl enable supervisord.service

config superviseur

[inet_http_server]
port=127.0.0.1:9001

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

Enregistrement de la gestion des processus

Le superviseur que j'ai installé est la série 3, et la configuration semble être légèrement différente de la série 2. Surtout autour de la sortie du journal. (2 séries sont anciennes, utilisons donc 3 séries)

Ci-dessous, le répertoire de stockage du journal de sortie standard pour les travaux est défini sur / var / log / supervisor / jobs. Si vous souhaitez l'utiliser tel quel, créez-le à l'avance. En outre, les paramètres de rotation suivants sont appropriés.

[program:GrowthForecast]
command=/usr/local/bin/growthforecast.pl --enable-float-number --data-dir /data/gf    ;Commande de démarrage
user=monadmin  ;Lancer l'utilisateur
autorestart=true  ;Redémarrage automatique lorsque le processus s'arrête
stdout_logfile=/var/log/supervisor/jobs/GrowthForecast-supervisord.log ;Journal de sortie standard
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=5
stdout_capture_maxbytes=1MB
redirect_stderr=true  ;Rediriger la sortie d'erreur vers la sortie standard

Créez également ceci dans /etc/supervisord.d/GrowthForecast.ini.

[program:HRForecast]
command=perl hrforecast.pl --config config.pl  ;Le chemin relatif du répertoire est OK.
user=monadmin
directory=/opt/HRForecast  ;Si vous disposez d'un répertoire d'installation, cliquez ici.
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

Créez également ceci dans /etc/supervisord.d/HRForecast.ini.

Confirmation de démarrage

sudo service supervisor start

C'est une bonne idée de vérifier les journaux sous / var / log / supervisor. Avec ce paramètre, le stdout / err du processus défini (GrowthForecast ou HRForecast) est également affiché.

Après le démarrage, essayez d'appuyer sur la commande client supervisorctl depuis quelqu'un d'autre que root. Frappez-le seul pour entrer dans l'interface de gestion de ligne de commande. Donc, en cas de succès, cela ressemble à ceci:

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

Depuis la console CLI, démarrez|stop|restart [Nom du processus]、 Une liste des processus de gestion apparaîtra dans l'état.

Supervisorctl sans entrer dans la console CLI{start|stop|restart|status} [Nom du processus]Etc. sont possibles.

Vous pouvez le faire sans devenir root, Vous disposez désormais d'un démon que vous pouvez gérer à partir du niveau utilisateur.

Si vous échouez

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

Si le démarrage échoue, l'état sera FATAL. C'est ce que j'ai écrit une commande qui ne passe pas par le PATH.

Ce que je n'ai pas fait et autre

Recommended Posts

Facilement démonisé avec Supervisor
Faites facilement un bip avec python
Facilement sans serveur avec Python en utilisant Calice
Écrivez facilement if-elif avec lambda
Créez facilement des CNN avec Keras
Créez facilement un profil avec un décorateur
Implémentez facilement des sous-commandes avec python click
Gérez facilement les listes avec python + sqlite3
Changez facilement de virtualenv Pyenv avec peco
Créez facilement des machines virtuelles avec Vagrant
Publiez facilement sur Twitter avec Python 3
Envoyez facilement des e-mails avec Gmail avec Django
Dessinez facilement une carte avec matplotlib.basemap
Créez facilement un environnement de développement avec Laragon
Démonisez une application Web Python avec Supervisor
Essayez facilement la génération automatique d'images avec DCGAN-tensor flow
Implémentez facilement la recherche incrémentielle ItemView avec PySide
Téléchargez facilement des mp3 / mp4 avec python et youtube-dl!