Im Systemd-Skript ausführen, solange es wahr ist

8

Ich habe ein Bash-Skript erhalten, das im Wesentlichen Folgendes ausführt:

#!/bin/bash

[...]

 while true; do
         str="broadcast "`randArrayElement "messages[@]"`
         server_send_message $str
         sleep $interval
 done

Jetzt möchte ich dies als systemd-Dienst ausführen. Mein Dienstskript sieht folgendermaßen aus:

[Unit]
Description=Announcer
After=network.target

[Service]
ExecStart=/usr/local/bin/somescript &; disown
ExecStop=/usr/bin/kill -9 `cat /tmp/somescript.pid`
Type=forking
PIDFile=/tmp/somescript.pid

[Install]
WantedBy=default.target

Wenn ich diesen Dienst über service somescript startihn ausführe, funktioniert er leider , aber aufgrund der while-Schleife bleibt mein Terminal beim Starten des Skripts hängen:

 somescript.service - somescript service
   Loaded: loaded (/etc/systemd/system/somescript.service; disabled; vendor preset: enabled)
   Active: activating (start) since Wed 2016-08-17 12:22:34 CEST; 43s ago
  Control: 17395 (somescript)
   CGroup: /system.slice/somescript.service
           ├─17395 /bin/bash /usr/local/bin/somescript &; disown
           └─17409 sleep 600

Wie kann ich dieses Skript als Dienst ausführen, ohne in der "start" / while while-Schleife hängen zu bleiben?

Flatron
quelle

Antworten:

8

Sie müssen systemd für sich arbeiten lassen. Lassen Sie es das Gabeln zu Beginn und das Beenden des Prozesses handhaben. ZB ersetzen Sie Ihr Serviceteil durch

[Service]
Type=simple
ExecStart=/usr/local/bin/somescript
PIDFile=/tmp/somescript.pid

dann können Sie verwenden systemctl start, statusund stop. Sie müssen sich daran erinnern, dass die Zeilen in systemd NICHT von der Shell interpretiert werden. Sie werden beispielsweise &;lediglich als ein weiterer Parameter mit 2 Zeichen an Ihr Skript übergeben.

meuh
quelle
Okay, danke, ich habe die Änderungen vorgenommen. Leider bleibt das Skript beim Versuch, es wie zuvor zu starten, hängen.
Flatron
1
Hast du daran gedacht sudo systemctl daemon-reload?
Meuh
Sie kennen diese Momente, in denen Sie denken, Sie hätten bereits etwas getan, obwohl Sie es nicht getan haben? Danke, es funktioniert! :)
Flatron
1

Abhängig von Ihren Anforderungen können Sie Ihre Schleife durch eine Systemd-Timer-Konfiguration ersetzen. Der Dienst wird nicht zweimal gestartet, selbst wenn server_send_message länger dauert als "OnUnitActiveSec":

somescript.timer

[Unit]
Description=Announce every minute

[Timer]
OnUnitActiveSec=1m
AccuracySec=10s
Unit=somescript.service

[Install]
WantedBy=default.target

somescript.service Serviceteil:

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c 'str="broadcast "`randArrayElement "messages[@]"`; server_send_message $str'
Gerrit Griebel
quelle