Linux.systemd: Unterschied zwischen den Versionen

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen
Zeile 187: Zeile 187:
**  Ich will mit freepascal einen Header Haben mit libsystemd.so
**  Ich will mit freepascal einen Header Haben mit libsystemd.so
*** #include "systemd/sd-daemon.h"
*** #include "systemd/sd-daemon.h"
*** sd_notify(0, "READY=1");
** Ich will einen ordentlichen cOrgaMon (Linux) haben der sich mit systemd unterhält
** Ich will einen ordentlichen cOrgaMon (Linux) haben der sich mit systemd unterhält
** So soll er in einem ersten Step melden, sobald er die Konfiguration geladen hat
** So soll er in einem ersten Step melden, sobald er die Konfiguration geladen hat

Version vom 10. Oktober 2016, 10:17 Uhr

"systemd" ist ein Linux-Programm das den ganzen Boot- und Start-Prozess des Linux-Betriebssystem durchführt. Wenn man Server-Dienste betreibt kommt man systemd in Berührung. Zu startende Dienste sind von anderen abhängig so dass dieser Boot-Prozess nicht ganz einfach ist.

Bedienung

  • starten: systemctl start <dienst>
  • Info ob er läuft, und Diagsnose: systemctl status <dienst>
  • stoppen: systemctl start <dienst>
  • Stop+Start: systemctl restart <dienst>

Dokumentation

Aufgaben und Anwendungen

Login

  • der "automatische Login" soll bei Servern selbstverständlich verhindert werden
    • Q: How To Disable Auto Login?
    • A: Yast - Security and Users - User/Group Management - Expert Options >Login Settings
  • der resourcenfressende grafische Anmeldeschirm soll unterdrückt werden
    • systemctl set-default multi-user.target

Apache2 Webserver

systemctl enable apache2
systemctl start apache2

Mounten

eines RAID Arrays

#
# srv-smb-ra6.mount
#
[Unit]
Description=srv-smb-ra6

[Mount]
What=/dev/md/Tokio:0
Where=/srv/smb/ra6

[Install]
WantedBy=local-fs.target
[Unit]
Description=srv-smb-ra6

[Mount]
What=/dev/disk/by-id/md-uuid-2ca7d214:9c6bfab4:b2ecf28b:72df44ca
Where=/srv/smb/ra6

[Install]
WantedBy=local-fs.target

eines remote Samba-Shares

#
# /etc/systemd/system/srv-nas-user1.mount
#
[Unit]
Description=srv-nas-user1
Requires=network-online.target
After=network-online.target

[Mount]
What=//newyork/user1
Where=/srv/nas/user1
Type=cifs
Options=guest

eines lokalen Samba-Shares

#
# /etc/systemd/system/root-.wine-drive_w.mount
#
# Mount für den cOrgaMon Server
# 
[Unit]
Description=root-.wine-drive_w
Requires=network-online.target smb.service
After=network-online.target smb.service

[Mount]
What=//tokio.pcworld/app
Where=/root/.wine/drive_w
Type=cifs
Options=guest

cOrgaMon

als XMLRPC-Server

#
# /etc/systemd/system/cOrgaMon-XMLRPC@.service
#
# systemd Rulez for the cOrgaMon Service als XMLRPC
#
# (c) 2016 Andreas Filsinger
#
[Unit]
Description=cOrgaMon-XMLRPC Server
Requires=root-.wine-drive_h.mount multi-user.target
After=root-.wine-drive_h.mount multi-user.target

[Service]
UMask=000
Environment="WINEDEBUG=-all" "LANG=de_DE.UTF-8"
ExecStart=/usr/bin/wine "C:\\Program Files (x86)\\OrgaMon\\cOrgaMon.exe" "--Port=%i"

als App-Server

#
# systemd Rulez for the cOrgaMon Service
#
# (c) 2016 Andreas Filsinger
#
[Unit]
Description=cOrgaMon App-Server
After=root-.wine-drive_w.mount
Requires=root-.wine-drive_w.mount

[Service]
UMask=000
Environment="WINEDEBUG=-all" "LANG=de_DE.UTF-8"
ExecStart=/usr/bin/wine "C:\\Program Files (x86)\\OrgaMon\\cOrgaMon.exe" "--app" "--Id=%i"

als Foto-Server

#
# systemd Rulez for the cOrgaMon Service
#
# (c) 2016 Andreas Filsinger
#
[Unit]
Description=cOrgaMon Foto-Server
Requires=root-.wine-drive_w.mount
After=root-.wine-drive_w.mount

[Service]
UMask=000
Environment="WINEDEBUG=-all" "LANG=de_DE.UTF-8"
ExecStart=/usr/bin/wine "C:\\Program Files (x86)\\OrgaMon\\cOrgaMon.exe" "--foto" "--Id=%i"

aqbd

#
# /etc/systemd/system/aqbd.service
#
# (c) Andreas Filsinger, OrgaMon.org
#

[Unit]
Description=AqBanking Daemon
After=multi-user.target

[Service]
StandardOutput=null
StandardError=null

ExecStartPre=/srv/aqb/aqbd.sh
ExecStart=/srv/aqb/aqb -D

[Install]
WantedBy=multi-user.target

Diagnose

  • sehr hilfreich ist die Grafik, die systemd erstellen kann.
  • Es ist dann immer gut zu Erkennen, wenn Dienste nicht starten können weil Abhängigkeiten nicht funktionieren
systemd-analyze plot > /srv/www/web/systemd.svg

  • journalctl --unit=sshd

Programmierung

  • Ziele
    • Ich will mit freepascal einen Header Haben mit libsystemd.so
      • #include "systemd/sd-daemon.h"
      • sd_notify(0, "READY=1");
    • Ich will einen ordentlichen cOrgaMon (Linux) haben der sich mit systemd unterhält
    • So soll er in einem ersten Step melden, sobald er die Konfiguration geladen hat
    • In einem 2. Step soll er über einen Watchdog kontrolliert werden
    • Ein weiter Schritt soll sein, dass das Logging über die Lib-Funktionen läuft
    • Ein weiterer Schritt soll ein, dass der Dienst ordentlich auf einen Shut-Down reagiert
      • Keine Annahme mehr von Aufgaben
      • Kontrollierter Abbruch oder Beendigung von aktuellen Aufgaben
      • Meldung an systemd wenn es save ist den PID zu killen oder freiwilliger exit

Alternativen

vor openSuSe 12.1

Nehmen wir an, Du hast ein Skript deindienst.sh das deinen Dienst startet, dies soll ab sofort auch nach einem Neustart des Server erfolgen. Das geht so:

  • in /etc/init.d
cp skeleton deindienst
ln -s deindienst /usr/sbin/rcdeindienst
  • nun deinen Dienst anpassen
joe deindienst
# Provides:          deindienst
# Required-Start:    $ALL
  • den ganzen Vorcheck wegmachen
-- snip

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance
FOO_BIN=/usr/sbin/FOO
test -x $FOO_BIN || { echo "$FOO_BIN not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; } 

# Check for existence of needed config file and read it
FOO_CONFIG=/etc/sysconfig/FOO
test -r $FOO_CONFIG || { echo "$FOO_CONFIG not existing";
       if [ "$1" = "stop" ]; then exit 0;
       else exit 6; fi; }

# Read config
. $FOO_CONFIG

-- snap --


  • im Startbereich einfach Dein Skript eintragen
       ## Start daemon with startproc(8). If this fails
       ## the return value is set appropriately by startproc.
       /sbin/startproc /etc/deindienst.sh
  • nun den Autostart sicherstellen
chkconfig --add deindienst
  • willst du jetzt schon starten?
rcdeindienst start