So konfigurieren Sie einen Linux-Dienst für den automatischen Start nach einem Absturz oder Neustart - Teil 1: Praktische Beispiele

Einführung

In diesem Lernprogramm erfahren Sie, wie Sie Systemdienste so konfigurieren, dass sie nach einem Absturz oder einem Neustart des Servers automatisch neu gestartet werden.

In diesem Beispiel wird MySQL verwendet. Sie können diese Prinzipien jedoch auch auf andere Dienste anwenden, die auf Ihrem Server ausgeführt werden, z. B. Nginx, Apache oder Ihre eigene Anwendung.

In diesem Tutorial werden die drei gängigsten Init-Systeme behandelt. Befolgen Sie daher unbedingt das für Ihre Distribution. (Viele Distributionen bieten mehrere Optionen an oder ermöglichen die Installation eines alternativen Init-Systems.)

  • System V ist das ältere Init-System:

    • Debian 6 und früher

    • Ubuntu 9.04 und früher

    • CentOS 5 und früher

  • Upstart:

    • Ubuntu 9.10 bis Ubuntu 14.10, einschließlich Ubuntu 14.04

    • CentOS 6

  • systemd ist das Init-System für die neuesten hier vorgestellten Distributionen:

    • Debian 7 und Debian 8

    • Ubuntu 15.04 und neuer

    • CentOS 7

Sie können auchPart 2, the reference article auschecken.

Hintergrund

Auf Ihrem laufenden Linux- oder Unix-System wird jederzeit eine Reihe von Hintergrundprozessen ausgeführt. Diese Prozesse - auch alsservices oderdaemons bezeichnet - sind möglicherweise systemeigen oder werden als Teil einer Anwendung ausgeführt.

Beispiele für Betriebssystemdienste:

  • sshd Daemon, der Remoteverbindungen ermöglicht

  • cupsd Daemon, der das Drucken steuert

Beispiele für Anwendungs-Daemons:

  • httpd/apache2 is a web server service

  • mongod ist ein Datenbank-Daemon

Diese Dienste sollen kontinuierlich ausgeführt werden, um sicherzustellen, dass unsere Websites, E-Mails, Datenbanken und anderen Apps immer verfügbar sind.

Als Administratoren möchten wir, dass unsere Linux-Dienste:

  • Laufen Sie ohne Fehler kontinuierlich

  • Startet automatisch nach einem Neustart oder Absturz des Systems

Manchmal fallen diese Dienste jedoch aus, sodass unsere Websites oder Apps nicht mehr verfügbar sind.

Ein Neustart kann aus vielen Gründen erfolgen: Es kann sich um einen geplanten Neustart, den letzten Schritt eines Patch-Updates oder das Ergebnis eines unerwarteten Systemverhaltens handeln. Ein Absturz tritt auf, wenn der Prozess unerwartet beendet wird oder auf Benutzer- oder Anwendungsanforderungen nicht mehr reagiert.

Ziel dieses Artikels ist es, Ihre Dienste auch nach einem Absturz oder Neustart wieder zum Laufen zu bringen.

Obwohl es keinen Ersatz für kontinuierliche Überwachung und Alarmierung gibt, können Linux-Dienste weitgehend selbstheilend gemacht werden, indem die Art und Weise geändert wird, wie sie von Service-Management-Daemons, auch alsinit-Systeme bezeichnet, behandelt werden.

Es gibt keine einzige Möglichkeit, dies zu tun: Es hängt alles von der jeweiligen Linux-Distribution und dem dazugehörigen Service Management Daemon ab. Die Standard-Init-Systeme für viele gängige Betriebssysteme sind in der obigen Einführung aufgeführt.

[.Hinweis]##

Wir werden näher aufrunlevels inPart 2 eingehen, aber für diesen Artikel ist es hilfreich zu verstehen, dass jedes Linux-System vier grundlegende Runlevel gemeinsam hat:

  • 0 - Runlevel 0 bedeutet Herunterfahren des Systems

  • 1 - Runlevel 1 bedeutet Einzelbenutzer-Rettungsmodus

  • 5 - Runlevel 5 bedeutet Mehrbenutzer, netzwerkfähig, grafischer Modus

  • 6 - Runlevel 6 dient zum Neustart des Systems

Im Allgemeinen bedeuten Runlevel 2, 3 und 4, dass Linux im netzwerkfähigen Mehrbenutzer-Textmodus gestartet wurde.

Wenn wir den automatischen Start eines Dienstes aktivieren, fügen wir ihn tatsächlich einem Runlevel hinzu.

Tore

In diesem zweiteiligen Lernprogramm erfahren Sie, wie Sie einen Linux-Dienst so konfigurieren, dass er automatisch startet, wenn das System neu startet oder abstürzt.

In diesem Teil der Serie, Teil 1, wird kurz erläutert, wie dies in drei verschiedenen Init-Modi (Initialisierungsmodi) durchgeführt wird:

  • System V init (auch als klassisches Init bekannt)

  • Emporkömmling

  • systemd

InPart 2 erklären wir, warum wir die Befehle ausgeführt haben und wie sie hinter den Kulissen funktionieren. Wir werden über Startskripte, wichtige Dateien und Konfigurationsparameter für jede Init-Methode sprechen. Ein Großteil der Diskussion in Teil 2 mag theoretisch erscheinen, wird jedoch als nützliche Referenz für das Verständnis der Grundlagen dienen.

Teil 1 behandelt nur die praktischen Aspekte der Einrichtung eines automatischen Neustarts.

Voraussetzungen

Um diesem Tutorial zu folgen, müssen Sie eine Reihe von DigitalOcean Droplets (oder Ihre eigenen Linux-Server) mit jeweils mindestens1 GBRAM erstellen. Wir werden nicht auf die Details der Erstellung eines Droplets eingehen, aber Sie können weitere Informationenhere finden.

Wir werden verschiedene Distributionen für unsere Beispiele verwenden.

  • Debian 6 x64 (dieses ältere Betriebssystem wird benötigt, um das System V init-System zu demonstrieren)

  • Ubuntu 14.04 x64 (für Upstart)

  • CentOS 7 x64 (für systemd)

  • Sie sollten auf jedem Server einen sudo-Benutzer einrichten. Informationen zur Funktionsweise von Sudo-Berechtigungen finden Sie in diesem DigitalOceantutorial about enabling sudo access

Wir empfehlen Ihnen, die Tröpfchen zu behalten, nachdem Sie Teil 1 dieses Tutorials befolgt haben, da wir fürPart 2 dasselbe Setup verwenden.

You should not run any commands, queries, or configurations from this tutorial on a production Linux server. Wir werden die Dienste im Rahmen von Tests unterbrechen, und Sie möchten nicht, dass Ihr Live-Server Probleme hat.

Automatisches Starten von Diensten mit System V

Beginnen wir unsere Diskussion mit System V init, dem ältesten hier diskutierten Init-System.

  • Debian 6 und früher

  • Ubuntu 9.04 und früher

  • CentOS 5 und früher

Mit System V werden die meisten Standardanwendungen, die Sie installieren können, wie z. B. Nginx oder MySQL, standardmäßigstart after reboot, standardmäßigNOT start after a crash. Sie werden bereits in/etc/init.d mit ihren eigenen Init-Skripten geliefert.

Für benutzerdefinierte Anwendungen müssen Sie Ihre eigenen Init-Skripte erstellen und die Dienste automatisch selbst starten lassen.

Das Erstellen eines eigenen Init-Skripts würde den Rahmen dieses Artikels sprengen. Sie können jedoch auf vorhandene Beispielskripts verweisen, um bei Bedarf eigene Skripts zu erstellen. System V verwendet Bash für Init-Skripte.

Auto-Start-Checkliste für System V

Dieser Abschnitt dient als Kurzreferenz, um sicherzustellen, dass Ihr Dienst so eingestellt ist, dass er automatisch gestartet wird.

Konfigurations-Checkliste

  • Stellen Sie sicher, dass der Dienst über ein funktionierendes Bash-Init-Skript bei/etc/init.d/service verfügt

  • Verwenden Sie den Befehlupdate-rc.d, um den Dienst zu aktivieren (oder für ein CentOS-Systemchkconfig):

  sudo update-rc.d service enable
  • Dies sollte einen Symlink in/etc/rc2.d erstellen, der wie folgt aussieht (doNOT erstellen dies manuell):

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

Beachten Sie, dass Sie auch Links aus den Verzeichnissen/etc/rc3.d bis/etc/rc5.d sehen sollten. Erfahren Sie mehr über diese Zahlen, wenn wirrunlevels diskutieren.

  • Fügen Sie am Ende der/etc/inittab-Datei einerespawn-Zeile für diesen Dienst hinzu. Hier ist ein allgemeines Beispiel:

/etc/inittab

    id:2345:respawn:/bin/sh /path/to/application/startup
  • Beenden und starten Sie den Dienst:

  sudo service service stop
  sudo service service start
  • Starten Sie den Server neu.

  sudo reboot

Test

Um zu testen, ob diese funktionieren, können Sie:

  • Starten Sie den Server neu und vergewissern Sie sich, dass der Dienst aktiv ist

  • Suche nach der Prozessnummer:

  ps -ef | grep service
  • Beende den Prozess:

  sudo kill -9 process_number
  • Warten Sie fünf Minuten und vergewissern Sie sich dann, dass der Dienst gesichert ist

[[Schritt-1 - Verbindung zu Ihrem Debian-6-Droplet]] == Schritt 1 - Verbindung zu Ihrem Debian-6-Droplet herstellen

Jetzt führen wir ein praktisches Beispiel mit MySQL durch.

Erstellen Sie über das DigitalOcean-Bedienfeld einDebian 6.0 x64-Droplet mit 1 GB RAM.

Nachdem das Droplet initialisiert wurde, stellen Sie mit SSH eine Verbindung zum Server her (Windows-Benutzer können eine Verbindung mit einem Tool wie PuTTY herstellen).

ssh sammy@your_server_ip

In den folgenden Anweisungen wird davon ausgegangen, dass Ihr Konto über Sudo-Berechtigungen verfügt.

[[Schritt-2 -—- Installation von MySQL]] == Schritt 2 - Installation von MySQL

Wir werden MySQL als Testdienst verwenden. Führen Sie den nächsten Befehl aus, um MySQL Server zu installieren:

sudo apt-get install mysql-server -y

Ein grafischer Bildschirm wie der folgende wird angezeigt, in dem Sie nach einem neuen Root-Passwort gefragt werden. Stell das zur Verfügung:

Provide a root password for MySQL

Wiederholen Sie das Passwort bei der nächsten Eingabeaufforderung:

Repeat root password at prompt

Drücken Sie zur BestätigungENTER.

Bei der Installation von MySQL rollen die Zeilen vorbei. Führen Sie nach Abschluss der Installation den folgenden Befehl aus, um die Installation abzusichern:

mysql_secure_installation

Dies fragt nach dem aktuellen root-Passwort. Drücken SieN, um das gleiche Passwort beizubehalten. Drücken Sie dannY, um den anonymen Benutzer zu entfernen, die Remote-Root-Anmeldung zu deaktivieren und die Testdatenbank zu entfernen. Drücken Sie abschließendY, um die Berechtigungstabellen neu zu laden.

Unsere MySQL-Installation sollte nun abgeschlossen sein.

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob der Dienst ausgeführt wird:

service mysql status

In der Ausgabe werden einige Informationszeilen angezeigt, von denen eine angibt, wie lange der MySQL-Dienst ausgeführt wurde (Betriebszeit).

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.

[[Schritt-3 - Konfigurieren von MySQL für den automatischen Start nach dem Neustart]] == Schritt 3 - Konfigurieren von MySQL für den automatischen Start nach dem Neustart

Standardmäßig ist MySQL bereits so eingestellt, dass es nach einem Neustart startet.

Sie sollten diesen Symlink zum Init-Skript von MySQL im Verzeichnis/etc/rc2.dehen. Beachten Sie, dass SieNOT versuchen sollten, diese Symlinks manuell zu erstellen. Verwenden Sie den Befehlupdate-rc.d, um Dienste zu aktivieren und zu deaktivieren.

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

Solange sich im Standard-Runlevel-Verzeichnis für den Dienst einS-Skript befindet, startet init den Dienst, wenn der Server gestartet wird.

Also sollte MySQL laufen. Jetzt ist es an der Zeit zu überprüfen, ob es beim Booten automatisch startet. Starten Sie die Maschine mit diesem Befehl neu:

sudo reboot

Sobald der Server wieder online ist, stellen Sie mit SSH eine Verbindung her.

Führen Sie den Befehlservice mysql status erneut aus. Wieder wird der Dienst als ausgeführt angezeigt. Dies bedeutet, dass der Dienst automatisch gestartet wird, wenn das Betriebssystem gestartet wird.

Allerdings werden nicht alle Dienste so sein. In diesen Fällen müssen wir die Dienste für den automatischen Neustart manuell konfigurieren. Für Debian können Sie mit dem Befehlupdate-rc.d Dienste hinzufügen (oder entfernen), die beim Booten automatisch gestartet werden.

Deaktivieren wir den MySQL-Dienst und sehen, wie er für den automatischen Start wieder aktiviert wird. Führen Sie diesen Befehl aus, um MySQL zu deaktivieren:

sudo update-rc.d mysql disable

Starten Sie den Server zum Testen erneut.

sudo reboot

Stellen Sie mit SSH eine Verbindung zu Ihrem Server her.

Versuchen Sie, mit dem MySQL-Client-Tool eine Verbindung zu MySQL herzustellen:

mysql -u root -p

Sie erhalten diese Nachricht:

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

Aktivieren Sie den Dienst erneut:

sudo update-rc.d mysql enable

Die Ausgabe wird sein:

Outputupdate-rc.d: using dependency based boot sequencing

Wenn Sie ein CentOS-System mit System V ausführen, verwenden die Befehlechkconfig anstelle vonupdate-rc.d.

Beachten Sie, dass das Aktivieren eines Dienstes für den automatischen Start zum Startzeitpunkt diesen nicht automatisch startet, wenn er gestoppt wird. Führen Sie den folgenden Befehl aus, um MySQL zu starten:

sudo service mysql start

[[Schritt-4 - Konfigurieren von MySQL zum automatischen Start nach dem Absturz]] == Schritt 4 - Konfigurieren von MySQL zum automatischen Start nach dem Absturz

Jetzt, da unser Dienst wieder ausgeführt wird, wollen wir sehen, ob er nach einem Absturz automatisch gestartet wird. Bei System V wirdNOT standardmäßig automatisch angezeigt.

Wir werden einen Absturz nachahmen, indem wir den Prozess abrupt beenden. Suchen Sie die Prozess-ID, indem Sie den folgenden Befehl ausführen:

ps -ef | grep mysql

Die Ausgabe wird ungefähr so ​​aussehen:

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

Die Hauptprozesse, auf denen MySQL ausgeführt wird, sindmysqld_safe undmysqld. mysqld_safe ist der übergeordnete Prozess vonmysqld.

In unserem Beispiel hier sehen wir, dass sie die Prozess-IDs 1167 bzw. 1292 haben. Ihre Prozessnummern sind oben rot hervorgehoben.

Emulieren wir einen Absturz mit dem Befehlkill -9. Stellen Sie sicher, dass Sie Ihre eigenen Prozess-IDs verwenden:

sudo kill -9 1167
sudo kill -9 1292

Überprüfen Sie den Servicestatus:

sudo service mysql status

Die Ausgabe zeigt, dass der Dienst beendet wurde:

OutputMySQL is stopped..

Wie bringen wir es auf den Punkt, nachdem unser Dienst abgestürzt ist? Natürlich können wir es neu starten, aber das wäre ein manueller Vorgang. Der Neustart soll automatisch erfolgen. Damit MySQL nach einem Absturz automatisch neu gestartet wird, müssen wir die Datei/etc/inittabbearbeiten.

Wir werden in Teil 2 ausführlicher auf die/etc/inittab-Datei eingehen. Lassen Sie uns jedoch zunächst verstehen, dass dies die erste Datei ist, die System V init beim Booten liest.

Unter anderem entscheidet/etc/inittab, wie sich ein Prozess verhalten soll, wenn er abstürzt. Bei einigen Prozessen ist es beabsichtigt, den Dienst erneut aufzurufen. Wir müssen sicherstellen, dass MySQL zu diesen Diensten gehört. Machen wir also zuerst eine Kopie davon:

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

Ein Hinweis zur Vorsicht: Seien Sie äußerst vorsichtig, wenn Sie die Datei/etc/inittabbearbeiten. Wenn Sie einen Fehler in Ihren Befehlen machen oder eine vorhandene Konfiguration löschen, wird das System beim Neustart möglicherweise nicht gestartet.

Öffnen Sie/etc/inittab mit einem Texteditor:

sudo nano /etc/inittab

Fügen Sie am Ende der Datei die folgende Zeile hinzu:

/etc/inittab

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

Also, was machen wir hier?

Nun, wir setzen einen Befehl in die Datei/etc/inittab aufrespawnmysqld_safe process, wenn er abstürzt. Es hat vier Felder, die durch einen Doppelpunkt (:) voneinander getrennt sind.

  • ms: Die ersten beiden Zeichen gebenid für den Prozess an.

  • 2345: Das zweite Feld gibt dierunlevelsan, auf die es angewendet werden soll. In diesem Fall gilt dies für Runlevel 2, 3, 4 und 5

  • respawn: Das dritte Feld gibtaction an (wir respawnen den Service).

  • /bin/sh /usr/bin/mysqld_safe: Schließlich ist das vierte Feldprocess (der auszuführende Befehl).

Wir werden in Teil 2 ausführlicher auf die Datei/etc/inittabzurückkommen und sehen, wie sie beim automatischen Starten von MySQL nach einem Absturz hilft. Speichern Sie vorerst die Datei und beenden Sie den Editor.

Starten Sie den Dienst erneut:

sudo service mysql start

Starten Sie den Server neu, damit die Änderung wirksam wird:

sudo reboot

Wiederholen Sie nun die Befehle, um die Prozessnummern zu suchen, die Prozesse abzubrechen und den Status erneut zu überprüfen, beginnend mitps -ef | grep mysql.

Wait for five minutes oder so und führen Sie dann den Befehl aus:

sudo service mysql status

Sie sollten sehen, dass diesmal MySQL nach dem Absturz automatisch gestartet wurde.

Das ist es! MySQL wird nun automatisch nach einem Dienstabsturz oder einem Systemneustart gestartet.

Automatisches Starten von Diensten mit Upstart

Upstart ist eine weitere Init-Methode, die erstmals in Ubuntu 6 eingeführt wurde. Es wurde der Standard in Ubuntu 9.10 und wurde später in RHEL 6 und seine Derivate übernommen. Googles Chrome OS verwendet auch Upstart.

  • Ubuntu 9.10 bis Ubuntu 14.10, einschließlich Ubuntu 14.04

  • CentOS 6

Während es bei der aktuellen LTS-Version von Ubuntu (14.04 zum Zeitpunkt des Schreibens) sehr gut läuft, wird es überall zu Gunsten von systemd auslaufen, worauf wir im letzten Abschnitt eingehen.

Upstart ist im Umgang mit Systemdiensten besser als System V, und es ist auch leicht zu verstehen. Wir werden uns jedoch in diesem Teil des Tutorials nicht eingehend mit Upstart befassen. In der DigitalOcean-Community gibt esvery good tutorial on Upstart.

Heute werden wir uns hauptsächlich auf Upstart-Konfigurationsdateien konzentrieren und sehen, wie diese zum automatischen Starten von Diensten verwendet werden.

Upstart verwendet Konfigurationsdateien, um Dienste zu steuern. Die Dateien befinden sich im Verzeichnis/etc/init. Die Dateien haben einfachen Textinhalt mit leicht lesbaren Abschnitten, die alsstanzas bezeichnet werden. Jede Zeilengruppe beschreibt einen anderen Aspekt des Dienstes und wie er sich verhalten sollte.

Standardmäßig verwenden die meisten Standardanwendungen, die Sie installieren können, wie Nginx oder MySQL, standardmäßigstart after reboot und auchstart after a crash, sodass Sie nichts tun müssen, damit dies funktioniert. Sie werden bereits in/etc/init mit ihren eigenen Init-Skripten geliefert.

Für benutzerdefinierte Anwendungen müssen Sie dies selbst einrichten. Lesen Sie dieintroductory Upstart tutorial, auf die zuvor verwiesen wurde, um zu erfahren, wie Sie Ihr eigenes benutzerdefiniertes Upstart-Skript erstellen.

Auto-Start-Checkliste für Upstart

Dieser Abschnitt dient als Kurzreferenz, um sicherzustellen, dass Ihr Dienst so eingestellt ist, dass er automatisch gestartet wird.

Konfigurations-Checkliste

  • Stellen Sie sicher, dass der Dienst über ein funktionsfähiges Upstart-Init-Skript verfügt, das sich bei/etc/init/service.conf befindet

    • Die Datei/etc/init/service.conf sollte eine Zeile wiestart on runlevel [2345] enthalten, um den automatischen Start nach einem Neustart zu ermöglichen

    • Die Datei/etc/init/service.conf sollte auch eine Zeile wierespawn enthalten, damit der Dienst nach einem Absturz erneut angezeigt werden kann

  • Stellen Sie sicher, dassno override file für den Dienst vorhanden sind:/etc/init/service.override

(Es würde nur einen geben, wenn Sie oder ein anderer Administrator einen früher gemacht hätten.)

  • Beenden und starten Sie den Dienst:

  sudo initctl stop service
  sudo initctl start service
  • Starten Sie den Server neu.

  sudo reboot

Test

Um zu testen, ob diese funktionieren, können Sie:

  • Starten Sie den Server neu und vergewissern Sie sich, dass der Dienst aktiv ist

  • Suche nach der Prozessnummer:

  ps -ef | grep service
  • Beende den Prozess:

  sudo kill -9 process_number
  • Stellen Sie innerhalb weniger Sekunden sicher, dass der Dienst gesichert ist

[[Schritt-1 - Verbindung zu Ihrem Ubuntu-14-04-Droplet herstellen]] == Schritt 1 - Verbindung zu Ihrem Ubuntu 14.04-Droplet herstellen

Wir verwenden einen Ubuntu 14.04-Server mit MySQL, um Upstart zu demonstrieren.

Erstellen Sie ein Droplet mit 1 GB RAM und wählen SieUbuntu 14.04 x64 als Basis-Image.

Stellen Sie mit SSH eine Verbindung zum Server her (Windows-Benutzer können eine Verbindung mit einem Tool wie PuTTy herstellen).

ssh sammy@your_server_ip

In den folgenden Anweisungen wird davon ausgegangen, dass Ihr Konto über Sudo-Berechtigungen verfügt.

[[Schritt-2 -—- Installation von MySQL]] == Schritt 2 - Installation von MySQL

Jetzt installieren wir MySQL.

Führen Sie den nächsten Befehl aus, um die Paketliste zu aktualisieren:

sudo apt-get update

Installieren Sie MySQL Server:

sudo apt-get install mysql-server -y

Erstellen Sie ein neues Root-Passwort für MySQL und bestätigen Sie es, wenn Sie dazu aufgefordert werden.

Führen Sie nach Abschluss der Installation den Befehlmysql_secure_installation aus:

mysql_secure_installation

Geben Sie auf die Eingabeaufforderungen die gleichen Antworten wie zuvor bei der Installation unter Debian (siehe den vorherigen Abschnitt).

[[Schritt-3 - Konfigurieren von MySQL für den automatischen Start nach dem Neustart]] == Schritt 3 - Konfigurieren von MySQL für den automatischen Start nach dem Neustart

Standardmäßig wird MySQL nach einem Neustart automatisch gestartet. Es ist hilfreich, die Konfiguration zu überprüfen, damit Sie auf diese Weise Ihre eigenen Dienste einrichten können.

Überprüfen wir zunächst, ob der MySQL-Server-Prozess ausgeführt wird:

sudo initctl status mysql

Sie sollten die Ausgabe so sehen:

Outputmysql start/running, process 2553

Starten Sie den Server neu:

sudo reboot

Wenn der Server wieder online ist, verwenden Sie SSH, um die Verbindung wiederherzustellen.

Überprüfen Sie den Status von MySQL:

sudo initctl status mysql

Die Ausgabe zeigt, dass MySQL automatisch gestartet wurde. Wir müssen hier also keine speziellen Schritte ausführen, um den Dienst zu aktivieren.

Beachten Sie, dass dies bei anderen Anwendungsdämonen möglicherweise nicht der Fall ist, bei denen Sie den Dienst manuell aktivieren müssen, indem Sie Ihre eigene Upstart-Datei im Verzeichnis/etc/init/erstellen.

Woher weiß Upstart, dass MySQL beim Neustart automatisch gestartet werden sollte?

Werfen wir einen Blick auf MySQLs Upstart-Init-Datei. Öffnen Sie die Datei/etc/init/mysql.confin einem Texteditor:

sudo nano /etc/init/mysql.conf

Eine Upstart-Datei ist kein Shell-Skript, wie wir es auf unserer Debian-Maschine gesehen haben.

Die Init-Konfigurationsdatei für MySQL enthält Skriptblöcke für Pre-Start- und Post-Start-Ereignisse. Diese Codeblöcke teilen dem Upstart-System mit, was ausgeführt werden soll, wenn der mysqld-Prozess gestartet wird oder bereits gestartet wurde.

Sehen wir uns die ersten zehn Zeilen der Datei genauer an:

/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

Wir können sehen, dass MySQL auf den Runlevels 2, 3, 4 und 5 gestartet werden soll und nicht auf den Runlevels 0, 1 und 6.

Hier definieren wir das Startverhalten des Dienstes für einen Upstart-Daemon. Im Gegensatz zu System V, in dem wir die Befehleupdate-rc.d oderchkconfig verwendet haben, verwenden wir in Upstart Dienstkonfigurationsdateien. Wir müssen lediglich die Zeilengruppestarthinzufügen / ändern. In Teil 2 werden wir mit dieser Datei spielen und sehen, wie sich das Aktivieren und Deaktivieren des MySQL-Dienstes auf diese Datei auswirkt und umgekehrt.

Die Anweisungenrespawn starten den Dienst nach einem Absturz neu, sodass wir sie im nächsten Schritt diskutieren werden.

[[Schritt-4 - Konfigurieren von MySQL zum automatischen Start nach dem Absturz]] == Schritt 4 - Konfigurieren von MySQL zum automatischen Start nach dem Absturz

Sie sollten immer noch/etc/init/mysql.confoffen haben.

Die Anweisungrespawnist selbsterklärend: MySQL wird gestartet, wenn es abstürzt. Dies ist standardmäßig bereits aktiviert.

Die Anweisung danach ist interessanter: Die Anweisungrespawn limit legt fest, wie oft Linux versucht, den abgestürzten Dienst in einem in Sekunden angegebenen Intervall neu zu starten. In diesem Fall ist das erste Argument (2) die Anzahl der Versuche und das zweite (5) das Intervall. Wenn der Dienst innerhalb dieses Schwellenwerts nicht erfolgreich gestartet (respawn) wird, wird er in einem gestoppten Zustand gehalten. Dies ist ein vernünftiges Standardverhalten, da es besser ist, einen Dienst zu deaktivieren, wenn er ständig abstürzt, als die Stabilität Ihres gesamten Systems zu beeinträchtigen.

Verlassen Sie zunächst den Texteditor, ohne Änderungen vorzunehmen.

Wie wir gerade gesehen haben, ist MySQL standardmäßig so konfiguriert, dass es nach einem Absturz automatisch zurückkehrt.

Um dies zu testen, überprüfen wir die Service-PID:

sudo initctl status mysql

Die neue PID (nach dem Neustart) für unser System sollte folgendermaßen aussehen:

Outputmysql start/running, process 961

Notieren Sie die Prozess-ID für Ihren Testfall. Als nächstes emulieren Sie einen Absturz, indem Sie den Prozess mit einem Befehlkill -9unter Verwendung Ihrer eigenen Prozessnummer beenden:

sudo kill -9 961

Überprüfen Sie jetzt den MySQL-Status. Es sollte (sofort oder innerhalb weniger Sekunden) mit einer neuen PID laufen:

sudo initctl status mysql

In unserem Fall ist die neue PID 1552:

Outputmysql start/running, process 1552

Wenn Sie möchten, können Sie es erneut töten. Es wird jedes Mal wieder auftauchen:

Dies geschieht aufgrund der Anweisungrespawn in der Dateimysql.conf.

/etc/init/mysql.conf

respawn

MySQL bietet standardmäßig die Möglichkeit, nach einem Absturz neu zu starten. Für andere Dienste müssen Sie diese Anweisung möglicherweise manuell in die Upstart-Datei einfügen. Wieder werden wir in Teil 2 sehen, wie wir das Absturzverhalten in der Konfigurationsdatei ändern können.

Automatisches Starten von Diensten mit systemd

systemd ist einsystem and service manager für Linux, das für die meisten neuen Linux-Distributionen zum De-facto-Initialisierungsdämon geworden ist.

Systemd wurde erstmals in Fedora implementiert und wird jetzt mit RHEL 7 und seinen Derivaten wie CentOS 7 ausgeliefert. Ubuntu 15.04 wird ebenfalls mit systemeigenem Betriebssystem ausgeliefert. Andere Distributionen haben entweder systemd integriert oder angekündigt, dass sie bald verfügbar sein werden.

  • Debian 7 und Debian 8

  • Ubuntu 15.04

  • CentOS 7

systemd ist abwärtskompatibel mit System V-Befehlen und Initialisierungsskripten.

Das bedeutet, dass jeder System V-Dienst auch unter systemd ausgeführt wird. Die meisten Verwaltungsbefehle für Upstart und System V wurden so geändert, dass sie unter systemd funktionieren. Aus diesem Grund wird es für System V init häufig alsdrop-in replacement bezeichnet.

Mit systemd werden die meisten Standardanwendungen, die Sie installieren können, wie z. B. Nginx oder MySQL, standardmäßigstart after reboot und auchstart after a crash, sodass Sie nichts tun müssen, damit dies funktioniert. Sie werden bereits in/etc/systemd/system mit ihren eigenen Init-Skripten geliefert.

Für benutzerdefinierte Anwendungen müssen Sie Ihre eigenen Init-Skripte erstellen und die Dienste automatisch selbst starten lassen. Wir werden hier nicht im Detail auf die Besonderheiten eines benutzerdefinierten Init-Skripts eingehen, aber Sie können mehr über systemd in diesemintroductory systemd article lesen.

Auto-Start-Checkliste für systemd

Dieser Abschnitt dient als Kurzreferenz, um sicherzustellen, dass Ihr Dienst so eingestellt ist, dass er automatisch gestartet wird.

Konfigurations-Checkliste

  • Stellen Sie sicher, dass der Dienst über ein funktionierendes Systemd-Init-Skript verfügt, das sich bei/etc/systemd/system/multi-user.target.wants/service.service befindet

  • Verwenden Sie den Befehlsystemctl, um den Dienst zu aktivieren:

  sudo systemctl enable service.service
  • Dies sollte einen Symlink in/etc/systemd/system/multi-user.target.wants/ erstellen, der wie folgt aussieht (doNOT erstellen dies manuell):

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

Dies aktiviert den automatischen Start nach einem Neustart.

  • Die Datei/etc/systemd/system/multi-user.target.wants/service.service sollte auch eine Zeile wieRestart=always im Abschnitt[Service] der Datei enthalten, damit der Dienst nach einem Absturz erneut angezeigt werden kann

  • Laden Sie den systemd-Daemon neu, gefolgt von einem Neustart des Dienstes:

  sudo systemctl daemon-reload
  sudo systemctl restart service.service

Test

Um zu testen, ob diese funktionieren, können Sie:

  • Starten Sie den Server neu und vergewissern Sie sich, dass der Dienst aktiv ist

  sudo reboot
  • Suche nach der Prozessnummer:

  ps -ef | grep service
  • Beende den Prozess:

  sudo kill -9 process_number
  • Stellen Sie innerhalb weniger Sekunden sicher, dass der Dienst gesichert ist

[[Schritt-1 - Verbindung zu Ihrem Centos-7-Droplet]] == Schritt 1 - Verbindung zu Ihrem CentOS 7-Droplet herstellen

Wir werden CentOS 7 und MySQL verwenden, um Ihnen das Konfigurieren von systemd-Diensten zu zeigen.

Erstellen Sie ein Droplet mit 1 GB RAM und wählen SieCentOS 7 x64 als Basis-Image.

Verwenden Sie SSH, um eine Verbindung zum Server herzustellen (Windows-Benutzer können eine Verbindung mit einem Tool wie PuTTy herstellen).

ssh sammy@your_server_ip

Wir gehen davon aus, dass Sie ein Konto mit Sudo-Berechtigungen verwenden.

[[Schritt-2 -—- Installation von MySQL]] == Schritt 2 - Installation von MySQL

Führen Sie die folgenden Befehle aus, um das MySQL Community-Server-Repository herunterzuladen und zu installieren:

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

Installieren Sie den MySQL Server:

sudo yum install mysql-server -y

Starten Sie nach Abschluss der Installation den mysqld-Dienst.

(Beachten Sie, dass dies nicht dasselbe ist, als wir MySQL unter Debian und Ubuntu installiert haben. In den anderen Distributionen wurde MySQL automatisch gestartet.)

Außerdem verwenden wir einen neuen systemd-Befehl namenssystemctl, um den Dienst zu steuern:

sudo systemctl start mysqld

Führen Sie als Nächstes den Befehlmysql_secure_installation aus.

mysql_secure_installation

In diesem Fall ist das MySQL-Root-Passwort leer, daher sollten Sie sich dafür entscheiden, ein neues Passwort zu erstellen. Geben Sie auf die anderen Eingabeaufforderungen die gleichen Antworten wie bei der Installation unter Debian oder Ubuntu (Einzelheiten finden Sie im vorherigen Abschnitt zu Debian).

[[Schritt-3 - Konfigurieren von MySQL für den automatischen Start nach dem Neustart]] == Schritt 3 - Konfigurieren von MySQL für den automatischen Start nach dem Neustart

Standardmäßig ist MySQL so konfiguriert, dass es nach einem Neustart automatisch startet. Schauen wir uns an, wie das funktioniert.

Führen Sie den Befehlsystemctl mit der Optionis-enabled aus, um zu überprüfen, ob der Daemonmysqldo konfiguriert wurde, dass er beim Start automatisch gestartet wird:

sudo systemctl is-enabled mysqld.service

Das Ergebnis wird sein:

Outputenabled

Starten wir die Maschine neu:

sudo reboot

Wenn der Server wieder hochfährt, stellen Sie mit SSH eine Verbindung her.

Führen Sie den folgenden Befehl aus, um den Servicestatus zu überprüfen:

sudo systemctl status mysqld.service

Die Ausgabe zeigt, dass der Dienst ausgeführt wird:

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)
...

Führen Sie den folgenden Befehl aus, um den Dienst zu deaktivieren:

sudo systemctl disable mysqld.service

Dadurch wird der Dienst nicht beendet, sondern deaktiviert. Tatsächlich zeigt die Ausgabe, dass die symbolischen Links gelöscht wurden:

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

Wenn Sie möchten, können Sie den Server neu starten und erneut testen, ob der MySQL-Server ausgeführt wird (dies wird nicht der Fall sein).

Oder führen Siesystemctl is-enabled erneut aus. wir sollten eine Antwort vondisabled erhalten:

sudo systemctl is-enabled mysqld.service
Outputdisabled

Aktivieren Sie den Dienst erneut:

sudo systemctl enable mysqld.service

Die Ausgabe zeigt die neu erstellten Symlinks:

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'

Ihr Dienst wird nach einem Neustart automatisch gestartet.

[[Schritt-4 - Konfigurieren von MySQL zum automatischen Start nach dem Absturz]] == Schritt 4 - Konfigurieren von MySQL zum automatischen Start nach dem Absturz

Jetzt werden wir sehen, wie MySQL so konfiguriert ist, dass es nach einem Absturz automatisch startet.

Öffnen Sie zunächst die Unit-Dateimysqld.servicein einem Editor (denken Sie daran, dass systemd-Dienste Unit-Dateien für die Konfiguration verwenden):

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

Am Ende der Datei befindet sich eine Anweisung zum Neustart:

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

[Unit]
...

[Install]
...

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

Der Wert des ParametersRestart wird aufalways gesetzt. Dies bedeutet, dass der MySQL-Dienst für saubere oder unsaubere Beendigungscodes oder Timeouts neu gestartet wird.

Hier wird ein automatischer Neustart in systemd definiert.

Genau wie die Anweisungrespawn in Upstart definiert der ParameterRestart in systemd, wie sich der Dienst verhalten soll, wenn er abstürzt.

Nicht alle systemd-Dienste haben diese Funktion standardmäßig aktiviert. Damit ein Dienst nach einem Absturz angezeigt wird, müssen wir diese zusätzliche Anweisung nur im Abschnitt[Service] der Diensteinheitendatei hinzufügen. Wenn die Abschnittsüberschrift nicht vorhanden ist, müssen wir auch die Überschrift[Service]hinzufügen.

Um einen Absturz zu emulieren, beenden Sie zuerst den Editor und überprüfen Sie dann die MySQL-Prozess-ID:

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)
...

Beenden Sie diesen Vorgang mit einemkill -9-Signal. In unserem Fall ist die Haupt-PID 661; Ersetzen Sie die PID durch Ihre eigene:

sudo kill -9 661

Überprüfen Sie den Status:

sudo systemctl status mysqld.service

Die Ausgabe zeigt, dass MySQL mit einer neuen PID neu gestartet wurde (in unserem Fall lautet die neue Prozess-ID 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)
...
...

Sie sehen also, dass der Dienst auch nach einem Absturz verfügbar ist.

Fazit

In diesem ersten Teil des Tutorials haben wir gesehen, wie System V-, Upstart- und systemd-Dienste so konfiguriert werden können, dass sie nach einem Neustart oder Absturz automatisch gestartet werden.

Wir haben auch die Dateien, Konfigurationsparameter und Befehle gesehen, die dieses Verhalten steuern.

Dies war eher eine praktische Einführung. Wir werden die Konzepte und Grundlagen in der nächsten Folge der Serie detaillierter behandeln.

Löschen Sie die Droplets noch nicht - lassen Sie sie laufen, da wir inthe next part darauf zurückkommen werden.