Systemd benutzerdefinierte Statusmeldung?

7

Ich versuche, einen systemd-Dienst zu schreiben, der die Optionen verfügbar machen soll start|stop|status|restart.

Dies ist das aktuelle Skript:

[Unit]
Description=Daemon to start ark server
After=network.target

[Service]
ExecStart=/etc/init.d/arkdaemon start
ExecStop=/etc/init.d/arkdaemon stop
Type=forking

[Install]
WantedBy=multi-user.target

Ich kann keine Möglichkeit finden, einen benutzerdefinierten Statusbefehl anzugeben.
Gibt es einen Weg, den ich denke, aber wie?

Fez Vrasta
quelle

Antworten:

5

Systemd unterstützt benutzerdefinierte Statusmeldungen, aber hier sind einige Voraussetzungen, die erfüllt sein müssen:

  • Art der Dienstleistung sollte sein notify
  • Ihr Dienst muss systemd entweder über den /run/systemd/notifySocket oder durch Aufrufen von systemd- notify mit Ihrem aktuellen Dienststatus aktualisieren

Als Referenz können Sie Apache HTTPD auf Fedora überprüfen (möglicherweise dasselbe in anderen Distributionen, weiß nicht):

systemctl status httpd.service


● httpd.service - The Apache HTTP Server    
  Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Active: active (running) since Fri 2017-10-06 15:21:07 CEST; 18h ago
  Docs: man:httpd.service(8)
  Process: 14424 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)  
  Main PID: 4105 (httpd)
  Status: "Total requests: 8; Idle/Busy workers 100/0;Requests/sec: 0.000118; Bytes served/sec:   0 B/sec"

Sie können sehen, dass Apache den Status als Gesamtanforderungen meldet : 8; Leerlauf / Beschäftigte 100/0

Wenn ich also stracePID 4105 anhänge, können wir sehen, dass regelmäßig Statusaktualisierungen gesendet werden an systemd:

sudo strace -f -p 4105

wait4(-1, 0x7ffcfab4a25c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {tv_sec=1, tv_usec=0}) = 0 (Timeout)
socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 8
getsockopt(8, SOL_SOCKET, SO_SNDBUF, [212992], [4]) = 0
setsockopt(8, SOL_SOCKET, SO_SNDBUFFORCE, [8388608], 4) = 0
sendmsg(8, {msg_name={sa_family=AF_UNIX, sun_path="/run/systemd/notify"}, msg_namelen=21, msg_iov=[{iov_base="READY=1\nSTATUS=Total requests: 8"..., iov_len=110}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 110
close(8)                                = 0
wait4(-1, 0x7ffcfab4a25c, WNOHANG|WSTOPPED, NULL) = 0

Sie können sehen, dass READY = 1 \ nSTATUS = Total Anfragen: 8 ... in Socket sendet/run/systemd/notify

Literatur-Empfehlungen

man systemd-notify

oder offizielle Dokumentation .

Beispiel: Dienststart in Systemd

rkosegi
quelle
9

Ich versuche, einen systemd-Dienst zu schreiben, der die Optionen verfügbar machen soll start|stop|status|restart.

Dein erster Fehler. Serviceeinheiten sind keine Skripte. Sie haben nicht haben Optionen. Die Optionen beziehen sich auf den systemctlBefehl und sind über alle Einheiten hinweg einheitlich.

Mir ist klar, dass die Verwendung von Centos nicht dem Standard entspricht.

Ihr zweiter Fehler, der mit Ihrem dritten Fehler zusammenhängt:

Ich werde eine PR zusammenführen, um die vielen Dinge in Debian / Ubuntu zu reparieren. dann müssen wir einen alternativen Daemon für Centos schreiben, da er eine andere Init-Methode verwendet.

CentOS ist nicht das Ungewöhnliche. Ubuntu Version 15, Debian 8 und CentOS 7 verwenden alle systemd und benötigen eine ordnungsgemäße systemd-Serviceeinheit.

ExecStart = / etc / init.d / arkdaemon start
ExecStop = / etc / init.d / arkdaemon stop

Dein vierter Fehler. Sie schreiben keine Serviceeinheiten, indem Sie alles in ein System 5- rcSkript übertragen. Abgesehen von der Tatsache, dass dies unter Debian und Ubuntu nicht funktioniert, weil sie versuchen, alles zurück zur Serviceeinheit zu leiten. Es ist ein Horror eines Konzepts, das einen Eintrag in das systematische Haus des Horrors verdient. Mit Blick auf das System 5 - rcSkript, bringt es zurück in all den verbohrt Unsinn - rassig greppen die Ausgabe ps, verbohrt Verwendung fallen Privilegien (statt acquire ihnen) - das auf einen geeigneten Service - Manager Umschalten von entledigt.sudo

Verwirren Sie nicht zufällig. Verstehen Sie, wie Ihr Dæmon tatsächlich ausgeführt wird , und schreiben Sie dann eine Serviceeinheit, die dies beschreibt.

Ihr System 5- rcSkript ruft ein Programm arkmanagermit startund stopVerben auf. Auf den ersten Blick könnte man also denken, dass eine systemd Serviceeinheit dies auch tun sollte. Aber es stellt sich heraus , dass arkmanager selbst ist noch ein weiterer armer Mann Dæmon Beauftragt (schlecht, wie sie immer sind) geschrieben in Shell - Skript, das alle von dem gleichen Unsinn macht und vieles mehr - greppen die Ausgabe psunter Verwendung screenals eine Möglichkeit (sic!) um einen Prozess zu verzweigen und später eine SIGINTan ihn zu senden , seine eigene (nicht gedrehte) Protokolldatei zu verwalten und festverdrahtete CSI-Sequenzen (sic!) in einem Programm zu verwenden, das bei der Verwaltung eines Dæmon nicht ausgeführt wird und mit einem Terminal in verbunden ist der erste Ort.

Sie konstruieren eifrig einen weiteren Horror. Halt.

Wenn man das schreckliche taumelnde Gebäude entfernt, in dem ein Dæmon-Supervisor eines armen Mannes einen anderen überwacht, der wiederum screenals dritter Ad-hoc-Supervisor missbraucht wird , stellt man fest, dass das zugrunde liegende Service-Management tatsächlich ungefähr so ​​aussieht:

[Einheit]
Beschreibung = ARK-Server
Documentation = https: //unix.stackexchange.com/questions/212059/
Nach = network.target

[Bedienung]
Benutzer = Dampf
Environment = SESSION = YourLinuxSessionName
Umgebung = QUERYPORT = 27016
Umgebung = PASS = Passwort
Umgebung = ADMINPASS = Administratorkennwort
ExecStart = / home / steam / ARK / ShooterGame / Binaries / Linux / ShooterGameServer TheIsland? SessionName = $ {SESSION}? QueryPort = $ {QUERYPORT}? ServerPassword = $ {PASS}? ServerAdminPassword = $ {ADMINPASS}? Listen
LimitNOFILE = 100000
Neustart = immer

[Installieren]
WantedBy = multi-user.target

Und was ist die erste Regel für die Migration zu systemd? Das stimmt. Es ist jetzt 2015 und jemand hat es höchstwahrscheinlich schon getan. Und hier hat mich schon jemand um 4 Tage geschlagen. Sie haben auch keinen Horror konstruiert.

Weiterführende Literatur

JdeBP
quelle
Nun,
"Mir ist klar, dass die Verwendung von Centos nicht dem Standard entspricht", hängt damit zusammen, dass ARK-Entwickler die Verwendung von Ubuntu 14.04 vorschlagen. Sie sprechen hier, ohne den Kontext zu kennen.
Fez Vrasta
"Ich werde eine PR zusammenführen, um die vielen Probleme in Debian / Ubuntu zu beheben. Dann müssen wir einen alternativen Daemon für Centos schreiben, da er eine andere Init-Methode verwendet." Hier habe ich über Ubuntu 14.04 und CentOS 6.6 gesprochen, und ja, Ubuntu 14.40 verwendet ein anderes Init-Skript als das von CentOS 6.6
Fez Vrasta
2
@JdeBP Ich mag Ihre Antwort nicht wirklich, scheint mir ziemlich beleidigend ohne eine richtige Antwort, die in einem Satz wäre, dass man anrufen kann systemctl status ..., um den Status zu erhalten ...
Betlista