Dienstleistungen, Dienstleistungen, Dienstleistungen. Ein Dienst ist ein großer Teil der Datenverarbeitung. Sie lesen diesen Artikel über einen Dienst. Auf Ihrem Computer werden Dienste ausgeführt. Das Internet ist voll davon.
Über systemctl
Unter Linux erfolgt die Ausführung und Verwaltung von Diensten standardmäßig über das Dienstprogramm systemd und den Befehl systemctl
. Seine Verwendung ist ziemlich einfach:Sie müssen nur den Namen des Dienstes kennen, den Sie verwalten möchten, dann können Sie diesen Befehl verwenden, um den Dienst zu starten oder zu stoppen, seinen Status zu überprüfen oder andere Funktionen auszuführen:
# systemctl start httpd
# systemctl stop httpd
# systemctl status httpd
Unit-Dateien
Ein Dienst wird in einer Datei namens Unit-Datei definiert. Sie befinden sich in der Regel im Verzeichnis /usr/lib/systemd/system
. Hier ist eine Beispielliste:
# ls /usr/lib/systemd/system
auditd.service multi-user.target sys-kernel-debug.mount
[email protected] multi-user.target.wants sys-kernel-tracing.mount
basic.target NetworkManager-dispatcher.service syslog.socket
basic.target.wants NetworkManager.service syslog.target.wants
blk-availability.service NetworkManager-wait-online.service
Manchmal müssen Sie mehr als eine Instanz eines Dienstes auf einem einzigen Host ausführen. Wenn Sie beispielsweise Websites für mehrere Kunden verwalten, verlangen Sicherheitsvorschriften, dass jeder Kunde eine eigene Instanz hat. Das bedeutet, dass Sie für jeden einen neuen Apache HTTP-Dienst ausführen müssen, aber viele Dienste zu haben, kann schwierig zu verwalten sein. Wenn Sie 10 verschiedene Kunden haben, müssten Sie 10 separate Einheitendateien erstellen, um sie zu verwalten. Glücklicherweise gibt es einen besseren Weg, mehrere Instanzen eines Dienstes zu handhaben.
Das @-Symbol
Beachten Sie, dass einige der Unit-Dateien ein @-Symbol in ihrem Namen haben. Dieses Symbol hat eine interessante Bedeutung. Tatsächlich werden Sie nach der Installation von Apache HTTP Server möglicherweise mehrere Service-Unit-Dateien bemerken, darunter eine mit dem @-Symbol im Namen – [email protected]
.
Ich werde Ihnen zeigen, wie dies das Leben eines Systemadministrators ein wenig einfacher machen kann, indem ich für dieses Beispiel den Apache HTTP-Server verwende:
# dnf -y install httpd
# cd /usr/lib/systemd/system
# ls -d http*
httpd.service [email protected] httpd.service.d httpd.socket httpd.socket.d
Das @-Symbol zeigt an, dass eine Ersetzung vorgenommen wird. Systemd nimmt alles, was Sie danach eingeben, und ersetzt die Variable %i
in der Service-Unit-Datei. Die Variable ist in diesem Auszug des [email protected]
zu sehen Datei:
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:[email protected](8)
[Service]
Type=notify
Environment=LANG=C
Environment=HTTPD_INSTANCE=%i
ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-%i
ExecStartPre=/bin/chown root.apache /run/httpd/instance-%i
ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-%i
ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-%i
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/%i.conf
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful -f conf/%i.conf
Beachten Sie, dass die standardmäßige httpd-Unit-Datei httpd.service
, hat kein @-Symbol im Namen und sieht anders aus. Es wird für eine einzelne grundlegende Standardinstanz des Apache HTTP-Servers verwendet.
Mehrere Instanzen ausführen
Mehr über Systemadministratoren
- Sysadmin-Blog aktivieren
- Das automatisierte Unternehmen:ein Leitfaden zur IT-Verwaltung mit Automatisierung
- eBook:Ansible-Automatisierung für SysAdmins
- Geschichten aus der Praxis:Ein Leitfaden für Systemadministratoren zur IT-Automatisierung
- eBook:Ein Leitfaden zu Kubernetes für SREs und Systemadministratoren
- Neueste Sysadmin-Artikel
Um mehrere Instanzen mit dieser speziellen Unit-Datei auszuführen, benötigt jede einen eindeutigen Namen. Angenommen, Sie haben zwei Kunden, The Little Bank und The Big Bank. Benennen Sie die Instanzen littlebank und bigbank. Um einen zu verwalten, hängen Sie einfach seinen Namen nach dem @-Symbol an. Starten Sie jede Instanz mit dem entsprechenden Befehl:
- littlebank:
systemctl start httpd@littlebank
- bigbank:
systemctl start httpd@bigbank
Beachten Sie, dass die meisten Dienste bestimmte Konfigurationen benötigen, um Konflikte zwischen verschiedenen Instanzen zu vermeiden. Ich werde sie hier nicht alle behandeln, aber Apache benötigt einige Dinge, einschließlich eindeutiger Listen-Port-Nummern, PID-Dateien und Dokument-Roots.
Ich werde es demonstrieren, indem ich versuche, die littlebank-Instanz zu starten. Ich erwarte, dass es fehlschlägt, aber es wird eine nützliche Statusmeldung liefern:
# systemctl start httpd@littlebank
# systemctl status httpd@littlebank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2020-11-10 11:41:20 EST; 1min 58s ago
Docs: man:[email protected](8)
Process: 2205 ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2207 ExecStartPre=/bin/chown root.apache /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2208 ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2209 ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2210 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/littlebank.conf (code=exited, status=1/FAILURE)
Main PID: 2210 (code=exited, status=1/FAILURE)
CPU: 26ms
Nov 10 11:41:20 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Nov 10 11:41:20 localhost.localdomain httpd[2210]: httpd: Could not open configuration file /etc/httpd/conf/littlebank.conf>
Nov 10 11:41:20 localhost.localdomain systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAIL>
Nov 10 11:41:20 localhost.localdomain systemd[1]: [email protected]: Failed with result 'exit-code'.
Nov 10 11:41:20 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
Sie können sehen, dass systemd den Instanznamen korrekt anstelle von %i
ersetzt Variable in der Unit-Datei. Apache kann jedoch nicht gestartet werden, da eine Konfigurationsdatei nicht geöffnet werden konnte. Also richte ich jetzt die Instanzen so ein, dass sie die Erstellung der erforderlichen Konfigurationsdateien enthalten (littlebank.conf
und bigbank.conf
) in /etc/httpd/conf/
:
# ls /etc/httpd/conf
bigbank.conf httpd.conf littlebank.conf
Jetzt können Sie jede Instanz mit systemctl
verwalten . Geben Sie start
aus und status
Befehle an jeden. Ich habe die Ausgabe auf die relevantesten Details gekürzt:
# systemctl start httpd@bigbank
# systemctl start httpd@littlebank
# systemctl status httpd@bigbank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:26:06 EST; 56min ago
# systemctl status httpd@littlebank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:25:58 EST; 55min ago
Hier ist die Prozessansicht dieser Instanzen. Es gibt mehr als einen, weil Apache Serverprozesse forkt, was es normalerweise tut:
# pgrep -a httpd
2834 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2835 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2836 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
3061 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3062 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3064 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
Einsetzen
Diese kleine systemd-Funktion ist sehr nützlich, wenn Sie viele Instanzen eines Dienstes benötigen. Ich hoffe, Sie werden es bei Ihrer Arbeit gut gebrauchen können.