Umstellung von Daemon-Diensten auf systemd

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen

Anlass dieser Anleitung

Ab November 2024 unterstützt die Managed Plattform ein RAM Kontingent pro Managed Webspace. Mitglieder buchen für ihre Webspaces jeweils ein RAM Kontingent in Schritten von jeweils 128 Megabyte. Das unterstützt uns besser bei der verursachergerechten Verteilung der Hardwarekosten, als es vorher mit einer Pauschale pro Serverdienst der Fall war. Änderungen des RAM Kontingents für einen Webspace nimmt der Service unter service@hostsharing.net entgegen, wie es bei anderen Paketoptionen die Vorgehensweise ist.

Damit die RAM Kontingente funktionieren, müssen im Managed Webspace alle Anwendungen, die im Userspace laufen, auf systemd umgestellt werden. Das betrifft Anwendungen, die bisher über z.B. cronjob, supervisor oder monit gestartet wurden.

Siehe auch unsere Systemd im Userspace Dokumentation.

Praktische Umstellung

Für eine Übergangsphase steht jedem Managed Webspace genügend RAM zur Verfügung, um eigene Serverdienste zu starten. Nach der Umstellung aller Dienste auf systemd wird dann das tatsächlich benötigte RAM-Kontingent ermittelt und gebucht.

cronjob

Rückblick auf Bearbeitung von Cronjobs

Mit dem Befehl crontab -l können die eigenen Cronjobs aufgelistet werden.

Mit dem Befehl crontab -e bearbeiten wir unsere Hintergrundjobs.

Wenn am Anfang einer Zeile das Rautezeichen # eingesetzt wird, dann ist die Zeile deaktiviert.

Auf der Seite Cron werden weitere Einzelheiten beschrieben.

Beispiel: Nextcloud Hintergrund Job

Hier haben wir ein Beispiel für einen Nextcloud Hintergrund Job, der alle 5 Minuten läuft, und in der crontab eingetragen ist:

*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php

Wir deaktivieren diesen Cronjob, in dem wir ein # vor die Zeile setzen, wie oben beschrieben.

Nun muss ggfs. das Verzeichnis für systemd angelegt werden:

mkdir -p .config/systemd/user

Nun wird die Datei für den oneshot Dienst angelegt:

nano $HOME/.config/systemd/user/nextcloud-job.service

mit diesem Inhalt:

[Unit]
Description=Nextcloud Hintergrundjob

[Service]
Type=oneshot
ExecStart=/usr/bin/php %h/nextcloud/cron.php

Beachte

Statt $HOME muss %h benutzt werden!


Nun wird die Datei für den Timer angelegt:

nano $HOME/.config/systemd/user/nextcloud-job.timer

mit diesem Inhalt:

[Unit]
Description=Timer für Nextcloud Hintergrundjob

[Timer]
OnCalendar=*:0/5
RandomizedDelaySec=30

[Install]
WantedBy=timers.target

Nun soll der Timer noch aktiviert werden:

systemctl --user enable nextcloud-job.timer


Beispiel: Logrotate aufrufen

Hier haben wir ein Beispiel für einen Logrotate Job, der einmal in der Nacht aufgerufen wird, und in der crontab eingetragen ist:

13 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate

Wir deaktivieren diesen Cronjob, in dem wir ein # vor die Zeile setzen, wie oben beschrieben.

Nun muss ggfs. das Verzeichnis für systemd angelegt werden:

mkdir -p .config/systemd/user

Nun wird die Datei für den oneshot Dienst angelegt:

nano $HOME/.config/systemd/user/logrotate-job.service

mit diesem Inhalt:

[Unit]
Description=Logrotate Job

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate -s %h/.logrotate.state %h/.logrotate

Beachte

Statt $HOME muss %h benutzt werden!


Nun wird die Datei für den Timer angelegt:

nano $HOME/.config/systemd/user/logrotate-job.timer

mit diesem Inhalt:

[Unit]
Description=Timer für Logrotate Job

[Timer]
OnCalendar=01:13
RandomizedDelaySec=300
Persistent=true

[Install]
WantedBy=timers.target

Nun soll der Timer noch aktiviert werden:

systemctl --user enable logrotate-job.timer

Monit

Beispiel: Redis

Hier haben wir eine Datei .monitrc, mit der ein Redis Dienst betrieben wird:

set daemon 60
    with start delay 120
set logfile /home/pacs/xyz00/nextcloud/var/monit.log
set idfile /home/pacs/xyz00/nextcloud/var/monit.id
set statefile /home/pacs/xyz00/nextcloud/var/monit.state
set mailserver localhost
set mail-format { from: webmaster@example.org }
set alert webmaster@example.org
set httpd port 12345 address xyz00.hostsharing.net 
     allow monit:topsecret
check process redis with pidfile /home/pacs/xyz00/nextcloud/redis/var/redis-server.pid
     start program "/usr/bin/redis-server /home/pacs/xyz00/nextcloud/redis/etc/redis.conf"
     stop program "/bin/bash -c '/bin/kill $( cat /home/pacs/xyz00/nextcloud/redis/var/redis-server.pid )'"

Der Start von monit nach einem Reboot des Servers wird verhindert, indem die entsprechende Zeile gelöscht wird:

crontab -e

entferne diese Zeile:
@reboot /usr/bin/monit -c $HOME/.monitrc

Die Dienste werden gestoppt:

killall -u $USER -KILL monit
killall -u $USER -KILL redis-server

Nun muss ggfs. das Verzeichnis für systemd angelegt werden:

mkdir -p .config/systemd/user

Nun wird die Datei für den Redis Dienst angelegt:

nano $HOME/.config/systemd/user/redis.service
[Unit]
Description=Redis Service
After=network-online.target

[Service]
WorkingDirectory=%h/redis/var
ExecStart=/usr/bin/redis-server %h/redis/etc/redis.conf
Restart=always
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=default.target

Es muss noch die folgende Zeile aus redis/etc/redis.conf entfernt werden:

daemonize yes

Nun soll der Dienst aktiviert und gestartet werden:

systemctl --user enable redis.service --now

supervisor

TODO: Beispiel

Ermittlung und Buchung des benötigten RAM Kontingent

TODO: siehe Systemd_im_Userspace#RAM_Kontingent_eines_Webspace