Gelöst: Eigenen systemd Service anlegen und starten beim Booten

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Benutzeravatar
Mesquita
Beiträge: 127
Registriert: 18.10.2018 18:08:10

Gelöst: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von Mesquita » 15.08.2023 18:08:12

Hallo User,

nach 2 Tagen der erfolglosen Fehlersuche muss ich mich heute hier mal melden und um Eure Hilfe bitten.

Ich habe einen Debianserver mit Gnome neu aufgesetzt. Dieser soll verschiedene Dienste zur Verfügung stellen. Bei der Konfiguration von Diensten habe ich mit Libretranslate begonnen. Das Paket läuft, soweit man es manuell nach dem Login als root mittels

Code: Alles auswählen

libretranslate --port 80 --host [IP des Servers]
aufruft. Soweit schon mal sehr gut. Seit zwei Tagen versuche ich nun diesen Aufruf automatisch beim Hochfahren des Servers auszuführen, sodass libretranslate automatisch startet. Entschieden habe ich mich traditionell für systemd. Die Datei "libretranslate.service" habe ich nach verschiedenen Vorlagen angelegt, alle Rechte vergeben und dann angemeldet. Der manuelle Start mittels

Code: Alles auswählen

systemctl start libretranslate.service
war aber nicht erfolgreich. So habe ich noch ein Bash-Script geschrieben, wo ich den Befehl eingefügt habe. In der "libretranslate.service" rufe ich jetzt das Bash-Script auf. Aktualisiert habe ich alles unter systemctl. Der manuell Aufruf von

Code: Alles auswählen

systemctl start libretranslate.service
ist jetzt erfolgreich! Das Problem ist aber, dass nach einem Neustart der Dienst nicht gestartet wird. Der Inhalt der "libretranslate.service" Datei kann ich Euch erst morgen hier präsentieren.

Hat jemand eine Idee, woran dies liegen könnte?

Thomas
Zuletzt geändert von Mesquita am 16.08.2023 11:02:24, insgesamt 2-mal geändert.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Eignen systemd Service anlegen und starten beim Booten

Beitrag von JTH » 15.08.2023 18:14:28

Das systemctl start startet den Dienst nur einmalig. Er läuft dann, bis er wieder gestoppt wird, sich selbst beendet oder der Rechner heruntergefahren wird.

Damit ein Dienst automatisch gestartet wird, musst du ihn aktivieren:

Code: Alles auswählen

systemctl enable --now libretranslate.service
Mit --now wird er aktiviert und gleichzeitig sofort gestartet.

Das Aktivieren sorgt dafür, dass der Dienst einem sogenannten Target (kann man gaaanz grob mit den alten Runleveln vergleichen) als Abhängigkeit hinzugefügt wird. Wenn ein Dienst beim Boot gestartet werden soll, nimmt man häufig das multi-user.target. Damit das Aktivieren oben funktioniert, musst du vorher Folgendes in deinem Service ergänzen:

Code: Alles auswählen

[Unit]
…

[Service]
…

[Install]
WantedBy=multi-user.target

Und ja, wenn du noch den Inhalt deiner .service zeigst, kann man dir auch helfen, warum es ohne den Umweg über ein Startskript nicht funktioniert hat.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Mesquita
Beiträge: 127
Registriert: 18.10.2018 18:08:10

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von Mesquita » 15.08.2023 18:25:36

Hallo @JTH,

vielen Dank für Deine Hinweise. Den Dienst habe ich mittels:

Code: Alles auswählen

systemctl enable libretranslate.service
angemeldet, sicherlich auch mehrfach. Dabei wurde dann auch die Meldung zu einem Link ausgegeben. Das "now" habe ich nicht eingebunden, wobei dies ev doch nur den Dienst sofort startet. Morgen kommt der Inhalt der Service -Datei. Von meinem jetzigen Standort habe ich keinen Zugriff darauf. Mittels journalctl.... bekomme ich auch die Meldung der Dienst wäre inactive.

Ich bin guter Hoffnung auf morgen.

mat6937
Beiträge: 2953
Registriert: 09.12.2014 10:44:00

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von mat6937 » 15.08.2023 20:56:06

Mesquita hat geschrieben: ↑ zum Beitrag ↑
15.08.2023 18:25:36

Code: Alles auswählen

systemctl enable libretranslate.service
..., wobei dies ev doch nur den Dienst sofort startet. Morgen kommt der Inhalt der Service -Datei. ....... bekomme ich auch die Meldung der Dienst wäre inactive.
Wenn Du es genau wissen willst, kannst Du:

Code: Alles auswählen

systemctl is-enabled libretranslate.service
systemctl is-active libretranslate.service
systemctl status libretranslate.service --full --no-pager
benutzen.

Benutzeravatar
Mesquita
Beiträge: 127
Registriert: 18.10.2018 18:08:10

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von Mesquita » 16.08.2023 09:12:26

Hier sende ich Euch die avisierten Inhalte.

libretranslate.service:

Code: Alles auswählen

[Unit]
Description=Libretranslate
After=network.target
After=multi-user.target
[Service]
Type=simple
ExecStart=/bin/bash /home/analyse/starttranslate
#ExecStart=/usr/local/bin/libretranslate --port 80 --host xxx.xxx.xxx.199
[Install]
WantedBy=multi-user.target
starttranslate:

Code: Alles auswählen

#!/bin/bash
/usr/local/bin/libretranslate --port 80 --host xxx.xxx.xxx.199
Wie aus der libretranslate.service zu erkennen, hatte ich im Vorfeld versucht auch Libretranslate direkt zu starten. Ich möchte nochmal darauf hinweisen, dass die händische Eingabe unter root von

Code: Alles auswählen

systemctl start libretranslate.service
den Dienst startet.

Was habe ich übersehen?

mat6937
Beiträge: 2953
Registriert: 09.12.2014 10:44:00

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von mat6937 » 16.08.2023 09:19:46

Mesquita hat geschrieben: ↑ zum Beitrag ↑
16.08.2023 09:12:26
Was habe ich übersehen?

Code: Alles auswählen

systemctl is-enabled libretranslate.service
?

EDIT:

Poste auch die Ausgabe von:

Code: Alles auswählen

systemctl status sys-subsystem-net-devices-*.device systemd-time-wait-sync.service network-online.target

Benutzeravatar
Mesquita
Beiträge: 127
Registriert: 18.10.2018 18:08:10

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von Mesquita » 16.08.2023 09:48:00

Der Aufruf von

Code: Alles auswählen

systemctl is-enabled libretranslate.service
ergibt in der Ausgabe "enabled". Ist auch ok, denn der Dienst war händisch gestartet.

Darauf hin habe ich das Gerät neu gestartet. Der Dienst (Website) lief nicht. Der Aufruf von

Code: Alles auswählen

systemctl is-enabled libretranslate.service
ergab wieder "enabled". Hier auch mal die Ausgabe von

Code: Alles auswählen

systmctl status libretranslate.service
:

Code: Alles auswählen

× libretranslate.service - Libretranslate
     Loaded: loaded (/etc/systemd/system/libretranslate.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Wed 2023-08-16 09:29:22 CEST; 2min 10s ago
    Process: 1316 ExecStart=/bin/bash /home/analyse/starttranslate (code=exited, status=1/FAILURE)
   Main PID: 1316 (code=exited, status=1/FAILURE)
        CPU: 2.333s

Aug 16 09:29:22 translate bash[1319]:   File "/usr/local/lib/python3.10/dist-packages/waitress/server.py", line 244, in __init__
Aug 16 09:29:22 translate bash[1319]:     self.bind_server_socket()
Aug 16 09:29:22 translate bash[1319]:   File "/usr/local/lib/python3.10/dist-packages/waitress/server.py", line 361, in bind_server_socket
Aug 16 09:29:22 translate bash[1319]:     self.bind(sockaddr)
Aug 16 09:29:22 translate bash[1319]:   File "/usr/local/lib/python3.10/dist-packages/waitress/wasyncore.py", line 396, in bind
Aug 16 09:29:22 translate bash[1319]:     return self.socket.bind(addr)
Aug 16 09:29:22 translate bash[1319]: OSError: [Errno 99] Cannot assign requested address
Aug 16 09:29:22 translate systemd[1]: libretranslate.service: Main process exited, code=exited, status=1/FAILURE
Aug 16 09:29:22 translate systemd[1]: libretranslate.service: Failed with result 'exit-code'.
Aug 16 09:29:22 translate systemd[1]: libretranslate.service: Consumed 2.333s CPU time.
Darauf hin habe ich den Dienst mittels

Code: Alles auswählen

systemctl start libretranslate.service
händich gestartet. Die Website lief und die Ausgabe von

Code: Alles auswählen

sysemctl status libretrnslate.service
ergibt:

Code: Alles auswählen

● libretranslate.service - Libretranslate
     Loaded: loaded (/etc/systemd/system/libretranslate.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-08-16 09:31:49 CEST; 36s ago
   Main PID: 5455 (bash)
      Tasks: 15 (limit: 18706)
     Memory: 180.7M
        CPU: 2.001s
     CGroup: /system.slice/libretranslate.service
             ├─5455 /bin/bash /home/analyse/starttranslate
             └─5456 /usr/bin/python3 /usr/local/bin/libretranslate --port 80 --host xxx.xxx.xxx.199

Aug 16 09:31:49 translate systemd[1]: Started Libretranslate.
Aug 16 09:31:57 translate bash[5456]: WARNING:waitress.queue:Task queue depth is 1
Aug 16 09:31:57 translate bash[5456]: WARNING:waitress.queue:Task queue depth is 2
Nach dem manuellen Start ist alles ok.

mat6937
Beiträge: 2953
Registriert: 09.12.2014 10:44:00

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von mat6937 » 16.08.2023 09:54:05

Mesquita hat geschrieben: ↑ zum Beitrag ↑
16.08.2023 09:48:00
Der Dienst (Website) lief nicht.
Dann brauchst Du zusätzliche "Abhängigkeiten" in der [Unit]-Section der service-unit (siehe EDIT oben).
Oder Du startest die deaktivierte service-unit, mit Hilfe einer (aktiven) timer-unit, z. B. 30 Sekunden nach dem die timer-unit aktiv ist.

EDIT:

Evtl. wird an der richtigen Stelle (Sections) der service-unit, auch:

Code: Alles auswählen

[Service]
Environment=DISPLAY=:0

[Install]
WantedBy=graphical.target
benötigt. Siehe als root, auch:

Code: Alles auswählen

systemctl --user show-environment
Zuletzt geändert von mat6937 am 16.08.2023 10:03:49, insgesamt 1-mal geändert.

Benutzeravatar
Mesquita
Beiträge: 127
Registriert: 18.10.2018 18:08:10

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von Mesquita » 16.08.2023 10:03:42

Ich Richtung Time dachte ich auch schon und wollte im Script dies einfügen, habe ich aber dann doch nicht versucht. Hier die Status Ausgabe (teilweise gekürzt) nach dem Bootvorgang:

Code: Alles auswählen

○ systemd-time-wait-sync.service - Wait Until Kernel Time Synchronized
     Loaded: loaded (/lib/systemd/system/systemd-time-wait-sync.service; disabled; vendor preset: disabled)
     Active: inactive (dead)
       Docs: man:systemd-time-wait-sync.service(8)

● network-online.target - Network is Online
     Loaded: loaded (/lib/systemd/system/network-online.target; static)
...

Aug 16 09:55:28 translate systemd[1]: Reached target Network is Online.

● sys-subsystem-net-devices-enp4s0.device - RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
     Loaded: loaded
     Active: active (plugged) since Wed 2023-08-16 09:55:21 CEST; 1min 38s ago
...
Der systemd-time-wait-sync.service ist nicht gestartet. Kann ich darüber die 30s einfügen oder wie hast Du dies gemeint?

mat6937
Beiträge: 2953
Registriert: 09.12.2014 10:44:00

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von mat6937 » 16.08.2023 10:09:49

Mesquita hat geschrieben: ↑ zum Beitrag ↑
16.08.2023 10:03:42
Der systemd-time-wait-sync.service ist nicht gestartet. Kann ich darüber die 30s einfügen oder wie hast Du dies gemeint?
Nein. Dann kannst Du diesen Dienst auch nicht als "Abhängigkeit" heranziehen/benutzen.

Versuch mal mit einer timer-unit:

Code: Alles auswählen

nano /etc/systemd/system/libretranslate.timer
Inhalt:

Code: Alles auswählen

[Unit]
Description=start libretranslate

[Timer]
OnActiveSec=30
# RandomizedDelaySec=10
# Persistent=true

[Install]
WantedBy=multi-user.target timers.target
Nach dem speichern:

Code: Alles auswählen

systemctl daemon-reload
systemctl enable libretranslate.timer
systemctl disable libretranslate.service
reboot
Nach dem reboot:

Code: Alles auswählen

systemctl status libretranslate.timer
systemctl status libretranslate
systemctl is-active libretranslate
BTW: Siehe auch das 2. EDIT oben.

EDIT: Evtl. als Alternative, auch mit einer *.desktop-Datei und Autostart versuchen. Siehe dazu z. B.: https://wiki.ubuntuusers.de/Autostart/

Benutzeravatar
Mesquita
Beiträge: 127
Registriert: 18.10.2018 18:08:10

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von Mesquita » 16.08.2023 10:22:40

Ich habe erstmal die 2 Zeilen in die .service eingefügt. Das Ergebnis hat sich nicht geändert. Ich nehme jetzt Deinen letzten Post und melde mich dann.

mat6937
Beiträge: 2953
Registriert: 09.12.2014 10:44:00

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von mat6937 » 16.08.2023 10:25:28

Mesquita hat geschrieben: ↑ zum Beitrag ↑
16.08.2023 10:22:40
Ich habe erstmal die 2 Zeilen in die .service eingefügt.
Welche 2 Zeilen und wie bzw. wo hast Du diese 2 Zeilen in der service-unit eingefügt? Wenn Du mit der timer-unit weiter machst, musst Du diese 2 Zeilen evtl. aus der service-unit entfernen oder kommentieren.

EDIT:

BTW: Wenn das ein python3-Script ist:

Code: Alles auswählen

python3 /usr/local/bin/libretranslate --port 80 --host xxx.xxx.xxx.199
, muss es nicht unbedingt via bash(-Script) (in der service-unit) ausgeführt werden.
Die andere Frage ist, ob dieses python3-Script zwingend als root ausgeführt werden muss oder wäre die Ausführung auch als normaler user möglich? Wenn ja, dann könntest Du auch eine user-service-unit benutzen.

Code: Alles auswählen

[Service]
Type=simple
User=<user>
# WorkingDirectory=/usr/local/bin
Environment=DISPLAY=:0
ExecStart=/usr/bin/python3 -u /usr/local/bin/libretranslate --port 80 --host xxx.xxx.xxx.199
ExecStop=+-/usr/bin/kill -15 -p $MAINPID
StandardOutput=inherit
StandardError=inherit
https://wiki.ubuntuusers.de/systemd/User_Units/

Benutzeravatar
Mesquita
Beiträge: 127
Registriert: 18.10.2018 18:08:10

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von Mesquita » 16.08.2023 11:02:07

Positive Meldung: Der Dienst wird nun zeitversetzt gestartet! Prima.

Jetzt erkläre mir bitte mal kurz, wie der .timer Dienst jetzt die Abarbeitung beeinflusst. Es gibt doch keinen Verweis auf die libretarnslate.service.

Deine weiteren Hinweise werde ich die nächsten Tage noch einfließen lassen. Die nächste Baustelle ist kubernetes. Auch da werde ich wohl Unterstützung brauchen. Aus Deinen Erfahrungen heraus gibt es da ein gutes deutschsprachiges Forum?

Vielen Dank schon mal.

Thomas

mat6937
Beiträge: 2953
Registriert: 09.12.2014 10:44:00

Re: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von mat6937 » 16.08.2023 11:08:21

Mesquita hat geschrieben: ↑ zum Beitrag ↑
16.08.2023 11:02:07
Es gibt doch keinen Verweis auf die libretarnslate.service.
Der Verweis auf die service-unit "libretarnslate.service" ist _der gleiche Namen_ für die timer-unit. In deinem Fall "libretarnslate.timer".
Mesquita hat geschrieben: ↑ zum Beitrag ↑
16.08.2023 11:02:07
... gibt es da ein gutes deutschsprachiges Forum?
Das weiß ich leider nicht.

Benutzeravatar
Mesquita
Beiträge: 127
Registriert: 18.10.2018 18:08:10

Re: Gelöst: Eigenen systemd Service anlegen und starten beim Booten

Beitrag von Mesquita » 16.08.2023 11:39:12

OK. Wenn der Verweis über den Namen erfolgt, ist es mir logisch.

Vielen Dank. :hail: :THX:

Antworten