Dienste überwachen

Zahlreiche Dienste verrichten still und leise ihre Aufgabe im Hintergrund, ohne dass sie sich wie ein Web- oder Datenbankserver direkt ansprechen ließen. Die Verfügbarkeit eines solchen Dienstes lässt sich daher nicht so einfach mit einer Abfrage überprüfen. In diesen Fällen müssen Sie darauf vertrauen, dass der Dienst bei einem aktiven Prozess auch seine Aufgabe erfüllt.

Die Abfrage des Status erfolgt anhand der Beispiele aus der Tabelle "Dienstekontrolle". Das einfachste Werkzeug für diese Aufgabe ist das Kommando ps. Mit dem Schalter -C Prozess beschränken Sie die Suche nach dem entsprechenden Prozess auf den angegebenen Namen (Listing 5). Die von Ps gelieferten Exit-Codes lassen sich gut in Skripten weiterverarbeiten. Alternativ greifen Sie auf die Ausgaben der per service-Kommando aufgerufenen Initskripte (Listing 6) oder – bei Distributionen mit Systemd – auf systemctl (Listing 7) zurück.

Dienstekontrolle

Methode Aufruf Exit-Codes
Prozessstatus, mit Angabe des Diensts ps -C Prozess 0 = existiert; 1 = existiert nicht
Initskript mit Option status service Startskript status keine, stattdessen individuelle Meldungen
Abfrage mit Systemctl systemctl status Dienst 0 = aktiv, 3 = deaktiviert
Kommunikation mit dem Dienst siehe Beispiele für Web- und Datenbankserver

Listing 5

$ ps -C ntpd
  PID TTY          TIME CMD
 1054 ?        00:00:01 ntpd
$ echo $?
0
# Dienst stoppen, hier via Systemd
$ sudo systemctl stop ntpd.service
$ ps -C ntpd
  PID TTY          TIME CMD
$ echo $?
1

Listing 6

$ service ntp status
 * NTP server is running
$ sudo service ntp stop
 * Stopping NTP server ntpd             [ OK ]
$ service status
 * NTP server is not running

Listing 7

$ systemctl status ntp
|- ntp.service - LSB: Start NTP daemon
   Loaded: loaded (/etc/init.d/ntp)
   Active: active (running) since Mo 2015-10-26 19:22:03 CET; 43s ago
[...]
$ echo $?
0
$ sudo systemctl stop ntp
$ systemctl status ntp
|- ntp.service - LSB: Start NTP daemon
   Loaded: loaded (/etc/init.d/ntp)
   Active: inactive (dead) since Mo 2015-10-26 19:23:04 CET; 4s ago
[...]
$ echo $?
3

Während Sie beim herkömmlichen SysVinit die Ausgaben des aufgerufenen Init-Skripts mit einigem Aufwand auswerten müssten, liefert der aktuelle Systemd handlichere Exit-Codes. Je nach Aufgabenstellung, Anforderungen und System kommen Sie bei der Überwachung eines Diensts mit einer der drei vorgestellten Methoden zum Ziel.

Auf Logins reagieren

Aus diesen Bausteinen realisieren Sie mit einfachen Mitteln kleine Skripte, die auf Ereignisse im System reagieren. So lassen sich beispielsweise Logins gut als Auslöser für Aktionen nutzen – etwa, um die abendlichen Diskussionen mit den Kindern zu umgehen, wenn diese zu lange am Computer sitzen. Mit dem Glockenschlag verbannen Sie sie dann, ob sie wollen oder nicht, automatisiert aus dem System.

Das Skript in Listing 8 ermittelt mithilfe von users die aktuell auf dem System angemeldeten Benutzer und filtert die Ausgabe mit grep. Damit erhalten Sie den Exit-Code 0 bei einem Treffer und 1 bei Fehlanzeige. Entsprechend des Ergebnisses und der aktuellen Zeit (untersagt sind die Stunden zwischen 21 und 7 Uhr) lässt das Skript den User simon im System oder wirft ihn kurzerhand hinaus (Abbildung 4).

Listing 8

#! /bin/sh
while true; do
  # Aktuelle Stunde ermitteln
  STUNDE=$(date +%H)
  # Ist Simon angemeldet?
  users | grep -q simon
  # Exitcode auswerten
  A=$?
  if [ $A -eq 0 ]; then
    # Simon ist angemeldet
    if [ $STUNDE -le 7 ]  || [ $STUNDE -ge 21 ]; then
    # vor 7 bzw. nach 21 Uhr
      killall -u simon
    fi
  fi
  sleep 60
done
Abbildung 4: Den Benutzer bei Überschreiten des Zeitfensters automatisch ausloggen.

Das Prinzip lässt sich auf Komfort- und Automatisierungsfunktionen übertragen. So starten Sie etwa mit einem leicht abgewandelten Skript (Listing 9) einen Webserver, sobald sich ein bestimmter Nutzer (im Beispiel jefe) anmeldet. In diesem Fall ist das Skript für den Einsatz auf einem Systemd-System abgestimmt, eventuell müssen Sie auch den Namen des Webserver-Diensts (im Beispiel httpd.service) anpassen.

Listing 9

#! /bin/sh
while true; do
  # Ist jefe angemeldet?
  users | grep -q jefe
  # Exitcode auswerten
  A=$?
  if [ $A -eq 0 ]; then
    # jefe angemeldet
    # Status des Webservers prüfen
    systemctl status httpd.service
    # Exitcode auswerten
    B=$?
    # Webserver bei Bedarf starten
    if [ $B -gt 0 ]; then
      systemctl start httpd.service
    fi
  else
    # jefe nicht angemeldet
    # Status des Webservers prüfen
    systemctl status httpd.service
    # Exitcode auswerten
    C=$?
    if [ $C -eq 0 ]; then
      # Webserver bei Bedarf beenden
      systemctl stop httpd.service
    fi
  fi
  sleep 60
done

Der Nutzer muss keine Kommandos eingeben oder Aktionen starten. Dabei müssen Sie nicht einmal Änderungen an den Home-Verzeichnissen der Benutzer vornehmen etwa in der ~/.profile oder ~/.bashrc) – es genügt eine aktive Sitzung. Mit diesem Vorgehen übertragen Sie wichtige Aufgaben, wie etwa den Start eines Diensts oder einer Datensicherung, auf unprivilegierte Benutzer. Dafür müssen Sie das Shellskript jedoch noch beim Hochfahren des Rechners automatisch aufrufen. Dabei gehen Sie je nach Init-System unterschiedlich vor.

Generell legen Sie das ausführbare Shellskript im Verzeichnis /usr/local/sbin ab. Bei älteren Systemen wie Debian 7 mit SysVinit kopieren Sie unter /etc/init.d die meist vorinstallierte Vorlage skeleton in eine neue Datei mit passendem Namen – im Beispiel webanmeldung. Anschließend bearbeiten Sie das Init-Skript nach Ihren Vorstellungen, speichern die Änderungen ab und machen die Datei mit chmod +x ausführbar. Mit update-rc.d webmeldung defaults aktivieren Sie sie für die üblichen Runlevel.

Arbeiten Sie auf einem Rechner mit Systemd, legen Sie entsprechend Listing 10 unter dem eventuell neu anzulegenden Verzeichnis /usr/local/lib/systemd/system eine neue Unit-Datei mit dem Namen webmeldung.service an und führen die Anweisungen aus Listing 11 aus. Diese verlinken die Anweisung im System und sorgen beim Booten für einen automatischen Start.

Listing 10

[Unit]
Description=Start Webserver bei Anmeldung jefe
Documentation=man:users(1)
[Service]
ExecStart=/usr/local/sbin/webmeldung.sh
IgnoreSIGPIPE=false
[Install]
WantedBy=multi-user.target

Listing 11

$ sudo systemctl enable webmeldung.service
Created symlink from /etc/systemd/system/multi-user.target.wants/webmeldung.service to /usr/local/lib/systemd/system/webmeldung.service.
$ sudo systemctl start webmeldung.service 
$ sudo systemctl status webmeldung.service
* webmeldung.service - Start Webserver bei Anmeldung jefe
   Loaded: loaded (/usr/local/lib/systemd/system/webmeldung.service; enabled; vendor preset: disabled)
   Active: active (running) since Di 2015-10-27 14:16:13 CET; 6s ago
[...]

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Broadcom Adapter 802.11n nachinstallieren
Thomas Mengel, 31.10.2017 20:06, 2 Antworten
Hallo, kann man nachträglich auf einer Liveversion, MX Linux auf einem USB-Stick, nachträglich...
RUN fsck Manually / Stromausfall
Arno Krug, 29.10.2017 12:51, 1 Antworten
Hallo, nach Absturz des Rechners aufgrund fehlendem Stroms startet Linux nicht mehr wie gewohn...
source.list öffnet sich nicht
sebastian reimann, 27.10.2017 09:32, 2 Antworten
hallo Zusammen Ich habe das problem Das ich meine source.list nicht öffnen kann weiß vlt jemman...
Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 6 Antworten
Hallo, bis jetzt hatte ich immer nur mit
IT-Kurse
Alice Trader, 26.09.2017 11:35, 2 Antworten
Hallo liebe Community, ich brauche Hilfe und bin sehr verzweifelt. Ih bin noch sehr neu in eure...