Redshift-Skript als Dienst ausführen

Redshift-Skript als Dienst ausführen

Ich bin ein Neuling bei Linux und versuche, das Schreiben von Skripten und das Erstellen eigener Dienste zu üben. Ich wollte mein einfaches Redshift-Skript, das die Farbtemperatur meines Bildschirms ändert, in einen Dienst umwandeln. Das Skript funktioniert, wenn ich es im Terminal ausführe, aber wenn ich versuche, es in einer .service-Datei auszuführen, stoße ich auf ein Problem. Für jede Hilfe wäre ich dankbar.

Mein Skript (redshift.sh):

#!/bin/bash
redshift -O 1500

Beim Ausführen ./redshift.shsehe ich, wie sich die Farbtemperatur meines Bildschirms ändert, und erhalte die folgende Ausgabe: Using method randr.

Mein Dienst (redshift.service):

[Unit]
Description=Set Redshift
[Service]
Type=simple
ExecStart=/bin/bash /usr/bin/redshift.sh
[Install]
WantedBy=default.target

Erwartung ist zu habenredshift.serviceführe mein Skript ausredshift.sh.

Dienst einrichten:

Ich habe die Skriptdatei kopiert /usr/binund den Modus auf x (ausführbar) geändert.

sudo cp redshift.sh /usr/bin/redshift.sh 
sudo chmod +x /usr/bin/redshift.sh

Ich habe die Servicedatei kopiert /etc/systemd/systemund den Modus auf 644 geändert.

sudo cp redshift.service /etc/systemd/system/redshift.service 
sudo chmod 644 /etc/systemd/system/redshift.service 

Ich versuche, meinen Dienst auszuführen:

sudo systemctl start redshift

Die Farbtemperatur der Anzeige ändert sich nicht!

Servicestatus abrufen:

sudo systemctl status redshift

Anhand der Ausgabe von systemctl status kann ich erkennen, dass das Skript versucht hat, ausgeführt zu werden, aber es sind einige Fehler aufgetreten. Irgendwelche Ideen, warum das so sein könnte? Die Statusausgabe wird unten angezeigt.

"Loaded: loaded (/etc/systemd/system/redshift.service; disabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Fri 2020-09-04 11:40:11 EDT; 8s ago
    Process: 21928 ExecStart=/bin/bash /usr/bin/redshift.sh (code=exited, status=1/FAILURE)
   Main PID: 21928 (code=exited, status=1/FAILURE)

Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: `RANDR Query Version' returned error -1
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Initialization of randr failed.
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Trying next method...
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: No protocol specified
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: X request failed: XOpenDisplay
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Initialization of vidmode failed.
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Trying next method...
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: No more methods to try.
Sep 04 11:40:11 labpc-ThinkPad-T540p systemd[1]: redshift.service: Main process exited, code=exited, status=1/FA>
Sep 04 11:40:11 labpc-ThinkPad-T540p systemd[1]: redshift.service: Failed with result 'exit-code'."

Statusausgabe

Ich habe dieses Tutorial befolgt, um meinen Dienst zu erstellen:https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/#create-a-custom-systemd-service

Antwort1

Möglicherweise müssen Sie Umgebungsvariablen wie Anzeige und Xauth festlegen.

Mein Dienst hat diese Zeile zum [service]Abschnitt hinzugefügt

Environment="DISPLAY=:0" "XAUTHORITY=/run/user/1000/gdm/Xauthority"

Sieh dir das anFadenfür weitere Einzelheiten.

Außerdem muss der Execstart keine .sh-Datei sein. Sie können den Pfad auf die Redshift-Exec setzen (oder in Ihrem Fall den Befehl wie in einem Terminal eingeben, da Redshift vermutlich in Ihrem PATH enthalten ist).

Antwort2

Sie müssen die Anzeige als Umgebung definieren und ausführen, nachdem der Display-Manager gestartet ist.

Bitte sehen Sie sich den Inhalt unten an.

[Unit]
Description=Redshift
After=display-manager.service

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/redshift -O 1500
Restart=always

[Install]
WantedBy=default.target

Sie können auch Parameter definieren ExeStartund zusätzliche benutzerdefinierte Bash-Skripte eliminieren.

verwandte Informationen