Ausführen des Redshift-Skripts als Dienst

Sep 05 2020

Ich bin sehr neu in Linux und versuche, das Schreiben von Skripten und das Erstellen meiner eigenen Dienste zu üben. Ich wollte mein einfaches einfaches Rotverschiebungsskript, das die Farbtemperatur meines Bildschirms ändert, zu einem Dienst machen. Das Skript funktioniert, wenn ich es im Terminal ausführe, aber wenn ich versuche, es in einer .service-Datei auszuführen, tritt ein Problem auf. Jede Hilfe wäre dankbar.

Mein Skript (redshift.sh):

#!/bin/bash
redshift -O 1500

Beim Ausführen ./redshift.shsehe ich, wie mein Bildschirm die Farbtemperatur ändert und eine Ausgabe erhält : Using method randr.

Mein Service (redshift.service):

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

Es wird erwartet, dass redshift.service mein Skript redshift.sh ausführt .

Service einrichten:

Ich habe die Skriptdatei /usr/binin x (ausführbare Datei) kopiert und den Modus geändert.

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

Ich habe die Servicedatei /etc/systemd/systemin 644 kopiert und den Modus 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 des Displays ändert sich nicht!

Status des Dienstes erhalten:

sudo systemctl status redshift

Gemessen an der Ausgabe des systemctl-Status sehe ich, dass das Skript versucht hat, ausgeführt zu werden, aber einige Fehler aufgetreten sind. Irgendwelche Gedanken darüber, warum dies der Fall 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'."

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

Antworten

1 yobart Oct 27 2020 at 19:54

Möglicherweise müssen Sie env-Variablen wie display & Xauth festlegen.

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

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

Weitere Informationen finden Sie in diesem Thread .

Auch der Execstart muss kein .sh sein. Sie können den Pfad als Redshift Exec festlegen (oder in Ihrem Fall den Befehl wie in einem Terminal eingeben, da sich Redshift vermutlich in Ihrem PATH befindet).

KKPatel Nov 02 2020 at 02:22

Sie müssen die Anzeige als Umgebung definieren und nach dem Start des Anzeigemanagers ausführen.

Bitte beachten Sie den Inhalt unten.

[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 in einem ExeStartzusätzlichen benutzerdefinierten Bash-Skript definieren und dieses entfernen.