Wie kann systemd meinen Befehl "status" aufrufen?

7

Wir ersetzen einen Ubuntu 8.04 Server durch einen Ubuntu 16.04. Der Server führt einen einzelnen Dienst (ohne Betriebssystem) aus, den wir benötigen. (Ich bin der Entwickler dieses Dienstes und nicht der Systemadministrator, der diese Woche im Urlaub ist.) Das Dienstskript sieht ungefähr so ​​aus:

#!/bin/sh

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions


# ...

case "$1" in
  start)
    umask 002
    #...
    exit $?
    ;;

  stop)
    # ...
    exit $?
    ;;

  restart)
        stop || exit $?
        start
        exit $?
        ;;

  status)
       # ...
       exit $?
       ;;

  *)
    echo "Usage my_service (start|stop|restart|status)"
    exit 1;;
esac

Nachdem ich den Pfad zu Java aktualisiert habe ... habe ich den Dienst zum Laufen gebracht. Aber anrufen:

sudo service my_service status

Gibt anstelle des Codes im Teil "status)" des Skripts eine "Standard" -Systemausgabe zurück. Gleiches Ergebnis, wenn ich dies stattdessen mache:

sudo /etc/init.d/my_service status

Ich bin nicht daran interessiert, was systemd denkt, ich möchte wissen / sehen; Ich möchte nur, dass es meinen Code anstelle seines eigenen ausführt.

Die Ausgabe von "status" wird von einer Webverwaltungskonsole analysiert, und ich möchte diese Anwendung nicht ändern müssen, um zu berücksichtigen, welche Linux-Version auf einem bestimmten Server installiert ist. "Status" für denselben Dienst sollte unabhängig von der jeweiligen Betriebssystemversion im selben Format (IMO) ausgegeben werden.

Wie kann ich systemd anweisen, meinen Statusbefehl zu "respektieren", anstatt ihn zu ignorieren?

Die Suche nach "systemd status" brachte mich nicht weiter, abgesehen von der Tatsache, dass ich erfahren habe, dass systemd ziemlich kompliziert erscheint.

Monster-
quelle
Möglicherweise sollten Sie keine Funktionen aus dem System beziehen und verwenden. Ich verstehe nicht, warum Sie /etc/init.d/my_service statusnicht genau das tun, was Sie geschrieben haben.
Rudimeier
Warten Sie, bis Sysadmin aus dem Urlaub zurückkommt, wäre die klügste Lösung imo.
Danila Ladner
@rudimeier Ich verstehe nicht, wie systemd auch "/etc/init.d/my_service status" überschreiben kann. Dann habe ich aufgegeben und hier gefragt.
Monster
1
@monster Sie beziehen /lib/lsb/init-functionsund andere Dateien. Dort können sie machen, was sie wollen. Sie könnten sogar exitIhren gesamten Code unten aufrufen und ignorieren.
Rudimeier
1
systemd unterstützt das Ausführen eines Programms zum Abrufen von Statusinformationen nicht. Sie können systemd jedoch über D-Bus benutzerdefinierte Statusinformationen bereitstellen.
Michael Hampton

Antworten:

4

systemdunterstützt keine benutzerdefinierten statusBefehle. Sie haben ein paar Alternativen:

  1. Sie können einen benutzerdefinierten Statusbefehl beibehalten und ihn stattdessen direkt über aufrufen systemd.
  2. systemdBietet eine maschinenparbare Statusausgabe über systemctl show your-service-name. Wie in zu sehen man systemctl, können Sie auch systemctl set-propertybenutzerdefinierte Eigenschaften festlegen, die im Status zurückgemeldet werden können. Sie können Ihrer Webverwaltungskonsole beibringen, stattdessen diese Ausgabe zu analysieren.
Mark Stosberg
quelle
1
Die kurze Antwort lautet also "Sie können die Ausgabe von: sudo service my_service status nicht diktieren". Nicht das, was ich mir erhofft hatte. Wenn ich die Webverwaltungskonsole trotzdem aktualisieren muss, kann ich sie nur lehren, um die Standardausgabe des Systems zu verstehen, und ich benötige keinen benutzerdefinierten "Status" mehr. Vielen Dank.
Monster
1
Was mich am meisten gestört hat, war, dass ich das Skript init.d jederzeit ändern kann, aber das Ändern der Webverwaltungskonsole muss genehmigt, überprüft, getestet und als Bugfix bereitgestellt werden, sodass dies mindestens eine Woche Verzögerung bedeutet Server "online".
Monster
1
serviceist ein altes Tool zum Verwalten von "System V-Init-Skripten". Aus Gründen der Kompatibilität auf systemd-basierten Systemen werden einige seiner Funktionen über systemd umgeleitet, wodurch eine zusätzliche Komplexitätsebene hinzugefügt wird (oder Kompatibilität, je nachdem, wie Sie es aussehen möchten!). systemctlist das systemd-native Äquivalent, obwohl die Syntax und die Unterbefehle einige Unterschiede aufweisen.
Mark Stosberg