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.
quelle
/etc/init.d/my_service status
nicht genau das tun, was Sie geschrieben haben./lib/lsb/init-functions
und andere Dateien. Dort können sie machen, was sie wollen. Sie könnten sogarexit
Ihren gesamten Code unten aufrufen und ignorieren.Antworten:
systemd
unterstützt keine benutzerdefiniertenstatus
Befehle. Sie haben ein paar Alternativen:systemd
.systemd
Bietet eine maschinenparbare Statusausgabe übersystemctl show your-service-name
. Wie in zu sehenman systemctl
, können Sie auchsystemctl set-property
benutzerdefinierte Eigenschaften festlegen, die im Status zurückgemeldet werden können. Sie können Ihrer Webverwaltungskonsole beibringen, stattdessen diese Ausgabe zu analysieren.quelle
service
ist 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!).systemctl
ist das systemd-native Äquivalent, obwohl die Syntax und die Unterbefehle einige Unterschiede aufweisen.