Comment configurer un service Linux pour qu’il démarre automatiquement après un crash ou un redémarrage - Partie 1: exemples pratiques

introduction

Ce didacticiel explique comment configurer les services système pour qu'ils redémarrent automatiquement après un crash ou un redémarrage du serveur.

L'exemple utilise MySQL, mais vous pouvez appliquer ces principes à d'autres services s'exécutant sur votre serveur, tels que Nginx, Apache ou votre propre application.

Nous couvrons les trois systèmes init les plus courants dans ce tutoriel, alors assurez-vous de suivre celui de votre distribution. (De nombreuses distributions offrent plusieurs options ou permettent l'installation d'un autre système init.)

  • System V est l'ancien système d'initialisation:

    • Debian 6 et antérieure

    • Ubuntu 9.04 et versions antérieures

    • CentOS 5 et versions antérieures

  • Upstart:

    • Ubuntu 9.10 à Ubuntu 14.10, y compris Ubuntu 14.04

    • CentOS 6

  • systemd est le système d'initialisation des distributions les plus récentes présentées ici:

    • Debian 7 et Debian 8

    • Ubuntu 15.04 et plus récent

    • CentOS 7

Vous pouvez également consulterPart 2, the reference article.

Contexte

Votre système Linux ou Unix en cours d'exécution aura un certain nombre de processus en arrière-plan exécutés à tout moment. Ces processus, également appelésservices oudaemons, peuvent être natifs du système d'exploitation ou s'exécuter dans le cadre d'une application.

Exemples de services du système d'exploitation:

  • démonsshd qui autorise les connexions à distance

  • démoncupsd qui contrôle l'impression

Exemples de démons d'application:

  • httpd/apache2 is a web server service

  • mongod est un démon de base de données

Ces services sont censés fonctionner en permanence pour garantir que nos sites Web, notre courrier, nos bases de données et nos autres applications sont toujours actifs.

En tant qu'administrateurs, nous souhaitons que nos services Linux:

  • Courir continuellement sans échouer

  • Démarrer automatiquement après le redémarrage ou le blocage du système

Pourtant, parfois, ces services tombent en panne, rendant nos sites Web ou nos applications indisponibles.

Un redémarrage peut se produire pour plusieurs raisons: il peut s'agir d'un redémarrage planifié, de la dernière étape d'une mise à jour de correctif ou du résultat d'un comportement inattendu du système. Un blocage correspond à ce qui se produit lorsque le processus s’arrête de manière inattendue ou ne répond plus aux demandes des utilisateurs ou des applications.

Le but de cet article est de remettre en marche vos services, même après un crash ou un redémarrage.

Bien qu’il n’y ait pas de substitut à la surveillance et aux alertes continues, les services Linux peuvent être largement auto-réparés en modifiant la façon dont ils sont gérés par les démons de gestion des services, également appelés systèmesinit.

Il n'y a pas qu'un seul moyen de faire cela: tout dépend de la distribution Linux particulière et du démon de gestion de services qui l'accompagne. Les systèmes init par défaut de nombreux systèmes d'exploitation courants sont présentés dans l'introduction ci-dessus.

[.Remarque]##

Nous entrerons plus en détail surrunlevels dansPart 2, mais pour cet article, cela aidera à comprendre que chaque système Linux a quatre niveaux d'exécution de base en commun:

  • 0 - Niveau d'exécution 0 signifie l'arrêt du système

  • 1 - Niveau d'exécution 1 signifie mode de secours mono-utilisateur

  • 5 - Niveau d'exécution 5 signifie mode graphique multi-utilisateurs, activé par le réseau

  • 6 - Le niveau d'exécution 6 est destiné au redémarrage du système

En général, les niveaux d'exécution 2, 3 et 4 signifient les états où Linux a démarré en mode texte multi-utilisateurs, activé par le réseau.

Lorsque nous activons le démarrage automatique d’un service, nous l’ajoutons à un niveau d'exécution.

Buts

Dans ce didacticiel en deux parties, nous verrons comment configurer un service Linux pour qu'il démarre automatiquement lorsque le système redémarre ou se bloque.

Cette tranche de la série, Partie 1, sera une analyse rapide de la procédure à suivre dans trois modes initiaux (initialisation) différents:

  • System V init (également appelé init classique)

  • Parvenu

  • systemd

DansPart 2, nous expliquerons pourquoi nous avons exécuté les commandes et comment elles fonctionnent dans les coulisses. Nous parlerons des scripts de démarrage, des fichiers importants et des paramètres de configuration pour chaque méthode init. Une grande partie de la discussion de la partie 2 peut sembler théorique, mais servira de référence utile pour comprendre les bases.

La première partie ne couvrira que les aspects pratiques de la configuration du redémarrage automatique.

Conditions préalables

Pour suivre ce didacticiel, vous devrez créer un certain nombre de gouttelettes DigitalOcean (ou créer vos propres serveurs Linux), chacune avec au moins1 GB de RAM. Nous n'entrerons pas dans les détails de la création d'un Droplet, mais vous pouvez trouver plus d'informationshere.

Nous allons utiliser différentes distributions pour nos exemples.

  • Debian 6 x64 (cet OS plus ancien est nécessaire pour démontrer le système init System V)

  • Ubuntu 14.04 x64 (pour Upstart)

  • CentOS 7 x64 (pour systemd)

  • Vous devez configurer un utilisateur sudo sur chaque serveur. Pour comprendre le fonctionnement des privilèges sudo, consultez ce DigitalOceantutorial about enabling sudo access

Nous vous conseillons de conserver les droplets après avoir suivi la partie 1 de ce tutoriel, car nous utiliserons la même configuration pourPart 2.

You should not run any commands, queries, or configurations from this tutorial on a production Linux server. Nous allons interrompre les services dans le cadre des tests, et vous ne voudriez pas que votre serveur en direct soit en panne.

Services de démarrage automatique avec System V

Commençons notre discussion avec System V init, le plus ancien système init décrit ici.

  • Debian 6 et antérieure

  • Ubuntu 9.04 et versions antérieures

  • CentOS 5 et versions antérieures

Avec System V, la plupart des applications standard que vous pouvez installer, telles que Nginx ou MySQL, serontstart after reboot par défaut, maisNOT start after a crash par défaut. Ils viendront déjà avec leurs propres scripts d'initialisation dans/etc/init.d.

Pour les applications personnalisées, vous devrez créer vos propres scripts d’initialisation et permettre aux services de démarrer automatiquement par vous-même.

La création de votre propre script init dépasse le cadre de cet article, mais vous pouvez vous référer à des exemples de scripts existants pour vous aider à créer le vôtre, si vous en avez besoin. System V utilise Bash pour les scripts d'initialisation.

Liste de contrôle de démarrage automatique pour System V

Cette section est une référence rapide pour vous assurer que votre service est configuré pour démarrer automatiquement.

Liste de contrôle de la configuration

  • Assurez-vous que le service dispose d'un script d'initialisation Bash fonctionnel situé à/etc/init.d/service

  • Utilisez la commandeupdate-rc.d pour activer le service (ou pour un système CentOS,chkconfig):

  sudo update-rc.d service enable
  • Cela devrait créer un lien symbolique dans/etc/rc2.d qui ressemble à ce qui suit (est-ce queNOT crée ceci manuellement):

  lrwxrwxrwx 1 root root  15 Jul 31 07:09 S02mysql -> ../init.d/service

Notez que vous devriez également voir les liens des répertoires/etc/rc3.d à/etc/rc5.d; apprenez-en plus sur ces chiffres lorsque nous discutons derunlevels.

  • Ajoutez une lignerespawn pour ce service au bas du fichier/etc/inittab. Voici un exemple générique:

/etc/inittab

    id:2345:respawn:/bin/sh /path/to/application/startup
  • Arrêtez puis démarrez le service:

  sudo service service stop
  sudo service service start
  • Redémarrez le serveur.

  sudo reboot

Test

Pour tester leur fonctionnement, vous pouvez:

  • Redémarrez le serveur, puis vérifiez que le service est actif.

  • Recherchez le numéro de processus:

  ps -ef | grep service
  • Tuez le processus:

  sudo kill -9 process_number
  • Attendez cinq minutes, puis vérifiez que le service est sauvegardé.

[[step-1 -—- connection-to-your-debian-6-droplet]] == Étape 1 - Connexion à votre droplet Debian 6

Nous allons maintenant passer à travers un exemple pratique, en utilisant MySQL.

Depuis le panneau de configuration de DigitalOcean, créez une goutteDebian 6.0 x64 avec 1 Go de RAM.

Une fois le Droplet initialisé, utilisez SSH pour vous connecter au serveur (les utilisateurs Windows peuvent se connecter à l’aide d’un outil tel que PuTTY).

ssh sammy@your_server_ip

Dans les instructions suivantes, nous supposons que votre compte dispose des privilèges sudo.

[[step-2 -—- Installing-mysql]] == Étape 2 - Installation de MySQL

Nous utiliserons MySQL comme service de test. Exécutez la commande suivante pour installer le serveur MySQL:

sudo apt-get install mysql-server -y

Un écran graphique semblable à celui présenté ci-dessous apparaîtra pour vous demander un nouveau mot de passe root. Fournir que:

Provide a root password for MySQL

Répétez le mot de passe à l'invite suivante:

Repeat root password at prompt

Appuyez surENTER pour confirmer.

Les lignes défileront au fur et à mesure que MySQL sera installé. Une fois l'installation terminée, exécutez la commande suivante pour renforcer votre installation:

mysql_secure_installation

Cela vous demandera le mot de passe root actuel. Appuyez surN pour conserver le même mot de passe. Ensuite, appuyez surY pour supprimer l'utilisateur anonyme, désactiver la connexion root à distance et supprimer la base de données de test. Enfin, appuyez surY pour recharger les tables de privilèges.

Notre installation de MySQL devrait maintenant être complète.

Pour vérifier si le service est en cours d'exécution, exécutez cette commande:

service mysql status

La sortie affichera quelques lignes d’informations, dont l’une indiquant la durée d’exécution du service MySQL (durée de disponibilité).

Output/usr/bin/mysqladmin  Ver 8.42 Distrib 5.1.73, for debian-linux-gnu on x86_64

. . .

Uptime:         4 days 18 hours 58 min 27 sec

Threads: 1  Questions: 18  Slow queries: 0  Opens: 15  Flush tables: 1  Open tables: 8  Queries per second avg: 0.0.

[[step-3 -—- configuration-mysql-to-auto-start-after-reboot]] == Étape 3 - Configuration de MySQL pour démarrer automatiquement après le redémarrage

Par défaut, MySQL est déjà configuré pour démarrer après un redémarrage.

Vous devriez voir ce lien symbolique vers le script init de MySQL dans le répertoire/etc/rc2.d. Notez que vous devriezNOT essayer de créer ces liens symboliques manuellement; utilisez la commandeupdate-rc.d pour activer et désactiver les services.

ls -l /etc/rc2.d
Outputlrwxrwxrwx 1 root root  15 Jul 31 07:09 S02mysql -> ../init.d/mysql

Tant qu'il y a un scriptS sous le répertoire de niveau d'exécution par défaut pour le service, init démarrera le service au démarrage du serveur.

Donc, MySQL devrait être en cours d'exécution. Il est maintenant temps de vérifier qu’il démarrera automatiquement au démarrage. Redémarrez la machine avec cette commande:

sudo reboot

Une fois le serveur en ligne, connectez-vous avec SSH.

Exécutez à nouveau la commandeservice mysql status. Encore une fois, le service sera affiché comme en cours d'exécution. Cela signifie que le service démarre automatiquement au démarrage du système d'exploitation.

Tous les services ne seront pas comme ça, cependant. Dans ces cas, nous devrons configurer manuellement les services pour un redémarrage automatique. Pour Debian, la commandeupdate-rc.d vous permet d'ajouter (ou de supprimer) des services à démarrer automatiquement au démarrage.

Désactivons le service MySQL et voyons comment le réactiver pour un démarrage automatique. Lançons cette commande pour désactiver MySQL:

sudo update-rc.d mysql disable

Pour tester, redémarrez le serveur.

sudo reboot

Connectez-vous à votre serveur avec SSH.

Essayez de vous connecter à MySQL en utilisant l’outil client MySQL:

mysql -u root -p

Vous recevrez ce message:

OutputERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Réactivez le service:

sudo update-rc.d mysql enable

La sortie sera:

Outputupdate-rc.d: using dependency based boot sequencing

Si vous exécutez un système CentOS avec System V, les commandes utiliserontchkconfig plutôt queupdate-rc.d.

Notez que l'activation du démarrage automatique d'un service au démarrage ne le lance pas automatiquement s'il est arrêté. Pour démarrer MySQL, exécutez cette commande:

sudo service mysql start

[[step-4 -—- configuration-mysql-to-auto-start-after-crash]] == Étape 4 - Configuration de MySQL pour démarrer automatiquement après un crash

Maintenant que notre service fonctionne à nouveau, voyons s’il démarre automatiquement après un crash. Avec System V, il seraNOT apparaître automatiquement par défaut.

Nous imiterons un crash en tuant le processus brusquement. Recherchez son ID de processus en exécutant la commande suivante:

ps -ef | grep mysql

Le résultat sera similaire à ceci:

Outputroot      1167     1  0 07:21 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql     1292  1167  0 07:21 pts/0    00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root      1293  1167  0 07:21 pts/0    00:00:00 logger -t mysqld -p daemon.error
root      1384  1123  0 07:21 pts/0    00:00:00 grep mysql

Les principaux processus qui exécutent MySQL sontmysqld_safe etmysqld. mysqld_safe est le processus parent demysqld.

Dans notre exemple ici, nous pouvons voir qu'ils ont les ID de processus 1167 et 1292 respectivement. Leurs numéros de processus sont surlignés en rouge ci-dessus.

Émulons un crash avec une commandekill -9. Assurez-vous d'utiliser vos propres ID de processus:

sudo kill -9 1167
sudo kill -9 1292

Vérifier l'état du service:

sudo service mysql status

La sortie montrera que le service est arrêté:

OutputMySQL is stopped..

Maintenant que notre service est tombé en panne, comment pouvons-nous le régler? Bien sûr, nous pouvons le redémarrer, mais ce serait un processus manuel; nous voulons que le redémarrage soit automatique. Pour que MySQL redémarre automatiquement après un crash, nous devons éditer le fichier/etc/inittab.

Nous parlerons plus en détail du fichier/etc/inittab dans la partie 2, mais pour l’instant, comprenons que c’est le premier fichier que l ’init System V lit lors du démarrage.

Entre autres choses,/etc/inittab décide du comportement d'un processus en cas de panne. Pour certains processus, il est prévu de rétablir le service. Nous devons nous assurer que MySQL fait partie de ces services. Commençons par en faire une copie:

sudo cp /etc/inittab /etc/inittab.orig

Attention: soyez extrêmement prudent lors de l'édition du fichier/etc/inittab. Si vous faites une erreur dans vos commandes ou supprimez une configuration existante, il se peut que le système ne démarre pas lorsque vous le redémarrez.

Ouvrez/etc/inittab avec un éditeur de texte:

sudo nano /etc/inittab

A la fin du fichier, ajoutez cette ligne:

/etc/inittab

ms:2345:respawn:/bin/sh /usr/bin/mysqld_safe

Alors qu'est-ce qu'on fait ici?

Eh bien, nous mettons une commande dans le fichier/etc/inittab àrespawn lemysqld_safe process quand il plante. Il comporte quatre champs, séparés l'un de l'autre par un signe deux-points (:).

  • ms: Les deux premiers caractères spécifient unid pour le processus.

  • 2345: Le deuxième champ spécifie lesrunlevels auxquels il est censé s'appliquer. Dans ce cas, il s’agit des niveaux d’analyse 2, 3, 4 et 5.

  • respawn: Le troisième champ spécifie lesaction (nous réapparaissons le service)

  • /bin/sh /usr/bin/mysqld_safe: Enfin, le quatrième champ est leprocess (la commande à exécuter)

Nous reviendrons sur le fichier/etc/inittab plus en détail dans la partie 2, et verrons comment il aide à démarrer automatiquement MySQL après un crash. Pour l'instant, sauvegardez le fichier et quittez l'éditeur.

Redémarrez le service:

sudo service mysql start

Redémarrez le serveur pour que le changement prenne effet:

sudo reboot

Maintenant, répétez les commandes pour localiser les numéros de processus, tuez les processus et vérifiez à nouveau l'état, en commençant parps -ef | grep mysql.

Wait for five minutes environ, puis exécutez la commande:

sudo service mysql status

Vous devriez voir que cette fois, MySQL a démarré automatiquement après le crash.

C'est ça! MySQL va maintenant démarrer automatiquement après un crash du service ou un redémarrage du système.

Services de démarrage automatique avec Upstart

Upstart est une autre méthode init, introduite pour la première fois dans Ubuntu 6. Il est devenu la valeur par défaut dans Ubuntu 9.10 et a ensuite été adopté dans RHEL 6 et ses dérivés. Le système d’exploitation Google de Google utilise également Upstart.

  • Ubuntu 9.10 à Ubuntu 14.10, y compris Ubuntu 14.04

  • CentOS 6

Bien que la version LTS actuelle d’Ubuntu fonctionne bien (la version 14.04 au moment de la rédaction), elle est supprimée partout au profit de systemd, que nous couvrirons dans la dernière section.

Upstart est meilleur que System V pour la gestion des services système, et il est également facile à comprendre. Cependant, nous ne plongerons pas profondément dans Upstart dans cette partie du tutoriel; il y a unvery good tutorial on Upstart dans la communauté DigitalOcean.

Aujourd'hui, nous allons principalement nous concentrer sur les fichiers de configuration Upstart et voir comment les utiliser pour démarrer automatiquement des services.

Upstart utilise des fichiers de configuration pour contrôler les services. Les fichiers se trouvent dans le répertoire/etc/init. Les fichiers ont un contenu en texte brut avec des sections faciles à lire appeléesstanzas. Chaque strophe décrit un aspect différent du service et son comportement.

Par défaut, la plupart des applications standard que vous pouvez installer, telles que Nginx ou MySQL, serontstart after reboot et aussistart after a crash par défaut, vous n'avez donc rien à faire pour que cela fonctionne. Ils viendront déjà avec leurs propres scripts d'initialisation dans/etc/init.

Pour les applications personnalisées, vous devrez le configurer vous-même. Pour savoir comment créer votre propre script Upstart personnalisé, lisez lesintroductory Upstart tutorial référencés précédemment.

Liste de contrôle de démarrage automatique pour Upstart

Cette section est une référence rapide pour vous assurer que votre service est configuré pour démarrer automatiquement.

Liste de contrôle de la configuration

  • Assurez-vous que le service dispose d'un script d'initialisation Upstart fonctionnel situé à/etc/init/service.conf

    • Le fichier/etc/init/service.conf doit contenir une ligne commestart on runlevel [2345] pour activer le démarrage automatique après un redémarrage

    • Le fichier/etc/init/service.conf doit également contenir une ligne commerespawn pour permettre au service de réapparaître après un crash

  • Assurez-vous qu'il y ano override file pour le service:/etc/init/service.override

(Il n'y en aurait qu'un si vous ou un autre administrateur en aviez un auparavant)

  • Arrêtez puis démarrez le service:

  sudo initctl stop service
  sudo initctl start service
  • Redémarrez le serveur.

  sudo reboot

Test

Pour tester leur fonctionnement, vous pouvez:

  • Redémarrez le serveur, puis vérifiez que le service est actif.

  • Recherchez le numéro de processus:

  ps -ef | grep service
  • Tuez le processus:

  sudo kill -9 process_number
  • En quelques secondes, vérifiez que le service est sauvegardé

[[step-1 -—- connection-to-your-ubuntu-14-04-droplet]] == Étape 1 - Connexion à votre droplet Ubuntu 14.04

Nous allons utiliser un serveur Ubuntu 14.04, exécutant MySQL, pour démontrer Upstart.

Créez un droplet avec 1 Go de RAM et choisissezUbuntu 14.04 x64 comme image de base.

Connectez-vous au serveur avec SSH (les utilisateurs Windows peuvent se connecter en utilisant un outil comme PuTTy).

ssh sammy@your_server_ip

Dans les instructions suivantes, nous supposons que votre compte dispose des privilèges sudo.

[[step-2 -—- Installing-mysql]] == Étape 2 - Installation de MySQL

Nous allons maintenant installer MySQL.

Exécutez la commande suivante pour mettre à jour la liste des packages:

sudo apt-get update

Installez le serveur MySQL:

sudo apt-get install mysql-server -y

Créez un nouveau mot de passe root pour MySQL et confirmez-le lorsque vous y êtes invité.

Une fois l'installation terminée, exécutez la commandemysql_secure_installation:

mysql_secure_installation

Donnez les mêmes réponses aux invites que lors de l’installation dans Debian (voir la section précédente).

[[step-3 -—- configuration-mysql-to-auto-start-after-reboot]] == Étape 3 - Configuration de MySQL pour démarrer automatiquement après le redémarrage

Par défaut, MySQL démarrera automatiquement après un redémarrage. Il est utile d’examiner sa configuration pour pouvoir configurer vos propres services de cette façon.

Tout d’abord, vérifions si le processus du serveur MySQL est en cours d’exécution:

sudo initctl status mysql

Vous devriez voir la sortie comme ceci:

Outputmysql start/running, process 2553

Redémarrez le serveur:

sudo reboot

Lorsque le serveur revient en ligne, utilisez SSH pour vous reconnecter.

Vérifiez le statut de MySQL:

sudo initctl status mysql

La sortie montrera que MySQL a démarré automatiquement. Nous n’avons donc rien à faire ici pour activer le service.

Gardez à l'esprit que cela peut ne pas être le cas pour d'autres démons d'application où vous devez activer manuellement le service en créant votre propre fichier Upstart dans le répertoire/etc/init/.

En outre, comment Upstart sait-il que MySQL devrait démarrer automatiquement au redémarrage?

Jetons un coup d’œil au fichier d’initialisation Upstart de MySQL. Ouvrez le fichier/etc/init/mysql.conf dans un éditeur de texte:

sudo nano /etc/init/mysql.conf

Un fichier Upstart n'est pas un script shell comme nous l'avons vu sur notre machine Debian.

Le fichier de configuration init pour MySQL comportera des blocs de script pour les événements pré-démarrés et post-démarrés. Ces blocs de code indiquent au système Upstart ce qu’il faut exécuter lorsque le processus mysqld est en cours ou a déjà été lancé.

Examinons de plus près les dix premières lignes du fichier:

/etc/init/mysql.conf

...
description     "MySQL Server"
author          "Mario Limonciello "

start on runlevel [2345]
stop on starting rc RUNLEVEL=[016]

respawn
respawn limit 2 5

Nous pouvons voir que MySQL est supposé démarrer aux niveaux de fonctionnement 2, 3, 4 et 5, et non aux niveaux de fonctionnement 0, 1 et 6.

C'est ici que nous définissons le comportement de démarrage du service pour un démon Upstart. Contrairement à System V où nous avons utilisé les commandesupdate-rc.d ouchkconfig, nous utilisons les fichiers de configuration de service dans Upstart. Tout ce que nous avons à faire est d'ajouter / modifier la strophestart. Dans la partie 2, nous allons jouer avec ce fichier et voir comment l'activation et la désactivation du service MySQL affectent ce fichier et inversement.

Les directivesrespawn redémarrent le service après un plantage, nous en parlerons donc à l'étape suivante.

[[step-4 -—- configuration-mysql-to-auto-start-after-crash]] == Étape 4 - Configuration de MySQL pour démarrer automatiquement après un crash

Vous devriez toujours avoir/etc/init/mysql.conf ouvert.

La directiverespawn est explicite: MySQL démarrera s'il plante. Ceci est déjà activé par défaut.

La directive qui suit est plus intéressante: la directiverespawn limit stipule combien de fois Linux tentera de redémarrer le service en panne dans un intervalle spécifié en secondes. Dans ce cas, le premier argument (2) est le nombre d'essais et le second (5) est l'intervalle. Si le service ne démarre pas (respawn) correctement dans les limites de ce seuil, il sera maintenu à l'état arrêté. Ce comportement sain par défaut, car si un service tombe en panne de manière continue, il est préférable de le désactiver que d’affecter la stabilité de l’ensemble du système.

Pour l'instant, quittez l'éditeur de texte sans apporter de modifications.

Comme nous venons de le voir, par défaut, MySQL est également configuré pour revenir automatiquement après un crash.

Pour tester cela, vérifions le PID du service:

sudo initctl status mysql

Le nouveau PID (après le redémarrage) de notre système devrait ressembler à ceci:

Outputmysql start/running, process 961

Notez l'ID de processus pour votre scénario de test. Ensuite, émulez un crash en tuant le processus avec une commandekill -9, en utilisant votre propre numéro de processus:

sudo kill -9 961

Vérifiez l'état de MySQL maintenant. Il devrait fonctionner (immédiatement ou dans quelques secondes) avec un nouveau PID:

sudo initctl status mysql

Dans notre cas, le nouveau PID est 1552:

Outputmysql start/running, process 1552

Si vous le souhaitez, vous pouvez le tuer à nouveau. Il reviendra à chaque fois:

Cela se produit à cause de la directiverespawn dans le fichiermysql.conf.

/etc/init/mysql.conf

respawn

MySQL offre la possibilité de redémarrer après un blocage par défaut, mais pour d'autres services, vous devrez peut-être ajouter cette directive manuellement dans le fichier Upstart. Encore une fois, dans la deuxième partie, nous verrons comment modifier le comportement en cas d’incident à partir du fichier de configuration.

Services de démarrage automatique avec systemd

systemd est unsystem and service manager pour Linux qui est devenu le démon d'initialisation de facto pour la plupart des nouvelles distributions Linux.

D'abord implémenté dans Fedora, systemd est maintenant livré avec RHEL 7 et ses dérivés tels que CentOS 7. Ubuntu 15.04 est également livré avec systemd natif. D'autres distributions ont soit incorporé systemd, soit annoncé prochainement.

  • Debian 7 et Debian 8

  • Ubuntu 15.04

  • CentOS 7

systemd est rétro-compatible avec les commandes et les scripts d'initialisation System V.

Cela signifie que tout service System V fonctionnera également sous systemd. La plupart des commandes administratives Upstart et System V ont été modifiées pour fonctionner sous systemd. C’est pourquoi on l’appelle souventdrop-in replacement pour l’initialisation de System V.

Avec systemd, la plupart des applications standard que vous pouvez installer, telles que Nginx ou MySQL, serontstart after reboot et aussistart after a crash par défaut, vous n'avez donc rien à faire pour que cela fonctionne. Ils viendront déjà avec leurs propres scripts d'initialisation dans/etc/systemd/system.

Pour les applications personnalisées, vous devrez créer vos propres scripts d’initialisation et permettre aux services de démarrer automatiquement par vous-même. Nous n'entrerons pas dans les détails de ce qui entre dans un script d'initialisation personnalisé en détail ici, mais vous pouvez en savoir plus sur systemd dans ceintroductory systemd article.

Liste de contrôle de démarrage automatique pour systemd

Cette section est une référence rapide pour vous assurer que votre service est configuré pour démarrer automatiquement.

Liste de contrôle de la configuration

  • Assurez-vous que le service dispose d'un script d'initialisation systemd fonctionnel situé à/etc/systemd/system/multi-user.target.wants/service.service

  • Utilisez la commandesystemctl pour activer le service:

  sudo systemctl enable service.service
  • Cela devrait créer un lien symbolique dans/etc/systemd/system/multi-user.target.wants/ qui ressemble à ce qui suit (est-ce queNOT crée ceci manuellement):

  lrwxrwxrwx 1 root root 38 Aug  1 04:43 /etc/systemd/system/multi-user.target.wants/service.service -> /usr/lib/systemd/system/service.service

Cela activera le démarrage automatique après un redémarrage.

  • Le fichier/etc/systemd/system/multi-user.target.wants/service.service doit également contenir une ligne commeRestart=always sous la section[Service] du fichier pour permettre au service de réapparaître après un crash

  • Rechargez le démon systemd, suivi d'un redémarrage du service:

  sudo systemctl daemon-reload
  sudo systemctl restart service.service

Test

Pour tester leur fonctionnement, vous pouvez:

  • Redémarrez le serveur, puis vérifiez que le service est actif.

  sudo reboot
  • Recherchez le numéro de processus:

  ps -ef | grep service
  • Tuez le processus:

  sudo kill -9 process_number
  • En quelques secondes, vérifiez que le service est sauvegardé

[[step-1 -—- connection-to-your-centos-7-droplet]] == Étape 1 - Connexion à votre Droplet CentOS 7

Nous utiliserons CentOS 7 et MySQL pour vous montrer comment configurer les services systemd.

Créez un droplet avec 1 Go de RAM et choisissezCentOS 7 x64 comme image de base.

Utilisez SSH pour vous connecter au serveur (les utilisateurs Windows peuvent se connecter en utilisant un outil tel que PuTTy).

ssh sammy@your_server_ip

Nous supposons que vous utilisez un compte avec les privilèges sudo.

[[step-2 -—- Installing-mysql]] == Étape 2 - Installation de MySQL

Exécutez les commandes suivantes pour télécharger et installer le référentiel du serveur MySQL Community:

sudo wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

Installez le serveur MySQL:

sudo yum install mysql-server -y

Une fois l'installation terminée, démarrez le service mysqld.

(Notez que ce n’est pas la même chose que lorsque nous avons installé MySQL sous Debian et Ubuntu. Dans les autres distributions, MySQL a démarré automatiquement.)

De plus, nous utilisons une nouvelle commande systemd appeléesystemctl pour contrôler le service:

sudo systemctl start mysqld

Ensuite, exécutez la commandemysql_secure_installation.

mysql_secure_installation

Dans ce cas, le mot de passe root de MySQL sera vide. Vous devez donc choisir de créer un nouveau mot de passe. Répondez aux mêmes invites que lors de l’installation sous Debian ou Ubuntu (voir la section précédente de Debian pour plus de détails).

[[step-3 -—- configuration-mysql-to-auto-start-after-reboot]] == Étape 3 - Configuration de MySQL pour démarrer automatiquement après le redémarrage

Par défaut, MySQL est configuré pour démarrer automatiquement après un redémarrage. Voyons comment cela fonctionne.

Pour vérifier si le démonmysqld a été configuré pour démarrer automatiquement au démarrage, exécutez la commandesystemctl avec l'optionis-enabled:

sudo systemctl is-enabled mysqld.service

Le résultat sera:

Outputenabled

Réinitialisons la machine:

sudo reboot

Lorsque le serveur est rétabli, connectez-vous avec SSH.

Exécutez la commande suivante pour vérifier l’état du service:

sudo systemctl status mysqld.service

La sortie montrera que le service est en cours d'exécution:

Outputmysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
   Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1min 52s ago
  Process: 662 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
  Process: 625 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 661 (mysqld_safe)
...

Pour désactiver le service, exécutez la commande suivante:

sudo systemctl disable mysqld.service

Cela n'arrêtera pas le service, mais le désactivera. En fait, la sortie indique que les liens symboliques ont été supprimés:

Outputrm '/etc/systemd/system/multi-user.target.wants/mysqld.service'
rm '/etc/systemd/system/mysql.service'

Si vous le souhaitez, vous pouvez redémarrer le serveur et tester à nouveau pour voir si le serveur MySQL est en cours de fonctionnement (ce ne sera pas le cas).

Ou exécutez à nouveausystemctl is-enabled; nous devrions obtenir une réponse dedisabled:

sudo systemctl is-enabled mysqld.service
Outputdisabled

Activez à nouveau le service:

sudo systemctl enable mysqld.service

La sortie montrera les liens symboliques recréés:

Outputln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/mysql.service'
ln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/multi-user.target.wants/mysqld.service'

Votre service démarrera automatiquement après un redémarrage.

[[step-4 -—- configuration-mysql-to-auto-start-after-crash]] == Étape 4 - Configuration de MySQL pour démarrer automatiquement après un crash

Nous allons maintenant voir comment MySQL est configuré pour démarrer automatiquement après un crash.

Tout d'abord, ouvrez le fichier d'unité demysqld.service dans un éditeur (rappelez-vous que les services systemd utilisent des fichiers d'unité pour la configuration):

sudo nano /etc/systemd/system/multi-user.target.wants/mysqld.service

A la fin du fichier, il y a une directive pour redémarrer:

/etc/systemd/system/multi-user.target.wants/mysqld.service

[Unit]
...

[Install]
...

[Service]
...
...
Restart=always
...

La valeur du paramètreRestart est définie suralways. Cela signifie que le service MySQL va redémarrer pour des codes de sortie ou des délais d'attente propres ou impurs.

C’est là qu’un redémarrage automatique est défini dans systemd.

Tout comme la directiverespawn dans Upstart, le paramètreRestart dans systemd définit comment le service doit se comporter en cas de panne.

Tous les services systemd n'ont pas cette fonctionnalité activée par défaut; pour qu'un service apparaisse après un crash, il suffit d'ajouter cette directive supplémentaire dans la section[Service] du fichier d'unité de service. Si l'en-tête de section n'existe pas, nous devons également ajouter l'en-tête[Service].

Pour émuler un plantage, quittez d'abord l'éditeur, puis vérifiez l'ID de processus MySQL:

sudo systemctl status mysqld.service
Outputmysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
   Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1h 7min ago
 Main PID: 661 (mysqld_safe)
...

Tuez ce processus avec un signalkill -9. Dans notre cas, le PID principal est 661; remplacez le PID par le vôtre:

sudo kill -9 661

Vérifiez le statut:

sudo systemctl status mysqld.service

La sortie montrera que MySQL a redémarré avec un nouveau PID (dans notre cas, le nouveau Process ID est 11217):

Outputmysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
   Active: active (running) since Fri 2015-07-31 23:06:38 EDT; 1min 8s ago
  Process: 11218 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
  Process: 11207 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 11217 (mysqld_safe)
...
...

Vous voyez donc que le service est activé même après un crash.

Conclusion

Dans cette première partie du didacticiel, nous avons vu comment les services System V, Upstart et systemd peuvent être configurés pour un démarrage automatique après un redémarrage ou un blocage.

Nous avons également vu les fichiers, les paramètres de configuration et les commandes qui contrôlent ce comportement.

C'était plus une introduction pratique. Nous aborderons les concepts et les bases plus en détail dans la prochaine tranche de la série.

Ne supprimez pas encore les Droplets - laissez-les fonctionner, car nous y reviendrons dansthe next part.

Related